chrizz-at
Goto Top

Shutdown Script in vbs

Hallo, ich brauche ein Script welches in einer Domäne alle Rechner herunterfährt. Besser gesagt auf 2 Domänen. Dies will ich aber von unserem Server aus machen. Das heisst ich muss irgendwie auf den anderen Domaincontroller der 2. Domäne zugreifen (Mit vbs als Administrator einloggen um die Rechner der 2. Domäne herunterzufahren)

Alles was ich zusammengebracht habe ist mit vbs einen bestimmten Rechner herunterzufahren mit den verschiedenen Parametern.. Wie mache ich das mit mehreren und wie logge ich mich auf dem 2. Server (DC für die 2. Domäne) an? Schlecht wär es auch nicht wenn sich die Server dann auch herunterfahren würden!

strComputer = "TestPC"  

Const LOGOFF = 0
Const SHUTDOWN = 1
Const REBOOT = 2
Const POWEROFF = 8
Const FORCE = 4

flags = POWEROFF + FORCE

Set objwmi = GetObject("winmgmts:" _  
    & "{(Shutdown)}!\\" & strComputer)  

wql = "Select * from Win32_OperatingSystem"  

Set colOperatingSystems = objwmi.ExecQuery(wql)

For Each objOperatingSystem In colOperatingSystems
    objOperatingSystem.Win32Shutdown flags, 0
Next

Bitte euch Experten um Hilfe face-sad
Christoph

Content-ID: 119700

Url: https://administrator.de/contentid/119700

Ausgedruckt am: 26.11.2024 um 08:11 Uhr

Logan000
Logan000 03.07.2009 um 15:01:42 Uhr
Goto Top
Moin Moin

1. Wenn Code postest, schau doch mal in die .
2. Eine Vertrauensstellung zwischen den Domänen würde die aufgabe erleichtern.
3. Hier hast duch ein etwas erweitertes Codebsp. mit Anmeldung: http://www.quaschtel.de/wsh/wmi.htm#Fremder_Rechner_herunterfahren
4. Um das mit mehreren PCs zu machen, baust Du dir entweder eine Schleife oder arbeitest eine Liste ab.
5. Ich verwende zum Shutdown/Reboot lieber die Shutdown.exe.

Gruß L.
Iwan
Iwan 03.07.2009 um 15:08:40 Uhr
Goto Top
Hallo Hallo face-wink

6. Ich verwende zum Shutdown/Reboot lieber die PSShutdown.exe.
vorher natürlich die Computer noch in eine TXT eintragen und dank dieser die Computer runterfahren/neu starten lassen
dann würde ich das ganze noch per Batch machen, evtl. vorher die Rechner noch anpingen, um zu sehen, ob sie überhaupt an sind und fertig wäre das ganze
chrizz-at
chrizz-at 06.07.2009 um 13:13:31 Uhr
Goto Top
Hallo, ich habe hier jetzt einen Code den ich gerne Rekursiv ausgeführt hätte?

Weil ich die PC Namen aus einer Textfile auslesen werde, bzw. die Variable PC ist nicht immer "hostmobile" sondern ändert sich durch das auslesen aus einer Textdatei.

Wie mache ich eine Rekursion da draus das der code für jeden Rechner in der Textfile ausgeführt wird?

lg Chris

' Rechnername und Logindaten   
PC = "hostmobile" '  <- Soll Variabel sein! - Kann auch IP Adresse verwendet werden.  
Const User = "Christoph"  
Const PW = "test"  


' Verbindung zu Fremdrechner & Betriebsystem  
	On Error Resume Next
	Set WMI = CreateObject("WBemScripting.SWbemLocator")  
	Set Login = WMI.ConnectServer(PC,"root/cimv2",USER,PW)  
	If Err.Number <> 0 then
					Wscript.Echo Now() & " Fehler beim Einloggen bei Rechner: " & PC  
					Err.Clear
					Shutdown = 1
			End if
	Set BS = Login.InstancesOf("Win32_OperatingSystem") ' Kann auch ExecQuery("SELECT * FROM Win32_OperatingSystem") verwendet werden.  


' Befehl zum Herunterfahren  
	On Error Resume Next
	For Each obj in BS
	Shutdown = obj.Shutdown
	Next

' Meldung erfolgreich oder Fehlermeldung ausgeben  
	If (Shutdown = 0) Then
	WScript.Echo Now() & ": Rechner " & PC & " wird/wurde heruntergefahren."  
	Else
	WScript.Echo Now() & ": Rechner " & PC & " konnte nicht heruntergefahren werden!"  
	End if
Logan000
Logan000 13.07.2009 um 09:44:35 Uhr
Goto Top
Moin Moin

Der Beitrag ist ja immer noch offen. face-wink
Ist doch nicht so schwer. Du schiebst dein Code in eine Function. Dann liest du die PCnamen aus einer Textdatei Zeilenweise aus und rufst deine Function mit dem PC namen auf.
Etwa so (ungetestet):
Const User = "Christoph"  
Const PW = "test"  
Const ForReading = 1
Dim szNextLine
Dim szValue
Set objDictionary = CreateObject("Scripting.Dictionary")  
Set objFSO = CreateObject("Scripting.FileSystemObject")  
Set objTextFile = objFSO.OpenTextFile("PCListe.txt", ForReading)  
Do Until objTextFile.AtEndOfStream 
		szNextLine = objTextFile.Readline
                PCShutdown(szNeuLine)
Loop

Function PCShutdown(PC,User,PW)
	On Error Resume Next
	Set WMI = CreateObject("WBemScripting.SWbemLocator")  
	Set Login = WMI.ConnectServer(PC,"root/cimv2",USER,PW)  
	If Err.Number <> 0 then
					Wscript.Echo Now() & " Fehler beim Einloggen bei Rechner: " & PC  
					Err.Clear
					Shutdown = 1
			End if
	Set BS = Login.InstancesOf("Win32_OperatingSystem") ' Kann auch ExecQuery("SELECT * FROM Win32_OperatingSystem") verwendet werden.  
	On Error Resume Next
	For Each obj in BS
	Shutdown = obj.Shutdown
	Next
	If (Shutdown = 0) Then
	WScript.Echo Now() & ": Rechner " & PC & " wird/wurde heruntergefahren."  
	Else
	WScript.Echo Now() & ": Rechner " & PC & " konnte nicht heruntergefahren werden!"  
	End if
End Function

Gruß L.
chrizz-at
chrizz-at 14.07.2009 um 09:48:48 Uhr
Goto Top
Ok das funktioniert mal nicht.. aber ist ein Ansatz!
Wenn ich ein bisschen Plan hätte würd ichs hinkriegen face-sad

Es scheitert bei der Zeile

Do Until objTextFile.AtEndOfStream 
		szNextLine = objTextFile.Readline
                PCShutdown(szNeuLine) <-- HIER!
Loop

face-sad
Logan000
Logan000 14.07.2009 um 11:43:58 Uhr
Goto Top
Moin Moin

Ein Tippfehler meinerseits.
Ist aber ziemlich offensichtlich.
So solte es funktionieren:
Do Until objTextFile.AtEndOfStream 
		szNextLine = objTextFile.Readline
'                PCShutdown(szNeuLine) <-- HIER!  
                PCShutdown(szNextLine) 
Loop

Gruß L.
chrizz-at
chrizz-at 14.07.2009 um 14:00:10 Uhr
Goto Top
Hab das Script selbst fertigstellen können!

Es sieht so aus wer es haben möchte:

Einfach Rechnernamen in die Textfile eintragen (und nätürlich auch Administrator Login) und los gehts!

' *******************************  
' Shutdown Script (c) HOST		*  
' Author: Christoph Strassmair	*  
' Created: 06.07.09				*  
' Last Changed: 14.07.09		*  
' *******************************  
' Login Daten  
Const User = "Christoph"  
Const PW = "PWTEST"  

' Dimensionieren der Variablen  
Dim szNextLine, objDictionary, objFSO, objTextFile, PC
Set objDictionary = CreateObject("Scripting.Dictionary")  
Set objFSO = CreateObject("Scripting.FileSystemObject")  
Set objTextFile = objFSO.OpenTextFile("PCListe.txt", 1)  

Do Until objTextFile.AtEndOfStream 
	szNextLine = objTextFile.Readline
	PCShutdown szNextLine, User, PW
Loop

Private Sub PCShutdown(PC,User,PW)
	On Error Resume Next
	Set WMI = CreateObject("WBemScripting.SWbemLocator")  
	Set Login = WMI.ConnectServer(PC,"root/cimv2",USER,PW)  
	If Err.Number <> 0 then
					Wscript.Echo Now() & " Fehler beim Einloggen bei Rechner: " & PC & vbCRLf & _  
					"Grund: " & Err.Description  
					Err.Clear
	End if
	Set BS = Login.InstancesOf("Win32_OperatingSystem") ' Kann auch ExecQuery("SELECT * FROM Win32_OperatingSystem") verwendet werden.  
	On Error Resume Next
	For Each obj in BS
	Shutdown = obj.Shutdown
	Next
	If (Err.Number <> 0) Then
	WScript.Echo Now() & ": Rechner " & PC & " konnte nicht heruntergefahren werden!"  
	Else
	WScript.Echo Now() & ": Rechner " & PC & " hat den Shutdown Befehl erhalten."  
	End if
End Sub

Danke für eure Hilfe!! Thread gelöst!