festus94
Goto Top

Alle PCs in Domäne rebooten

Suche Möglichkeit, alle PCs in Windows-Domäne auf einmal neuzustarten

Hallo,

wie oben beschrieben, suche ich eine Möglichkeit, alle PCs in einer Windows-Domäne auf einmal zu rebooten.
Ich dachte daran, einfach einen Shutdown-Befehl an die Broadcast-Adresse zu senden. Das hat allerdings nicht
funktioniert. Stattdessen kam die Meldung, dass der Client nicht gefunden wurde.

Habt ihr eine Idee, wie ich dieses Problem lösen könnte ?

Vielen Dank für alle Tipps im Vorraus !


Viele Grüße
tbnwadm

Content-Key: 168937

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

Printed on: April 25, 2024 at 00:04 o'clock

Member: Xaero1982
Xaero1982 Jun 30, 2011 at 20:21:53 (UTC)
Goto Top
Hi,

leg dir ne Liste an mit allen Computernamen.

Zusätzlich brauchst du die PSTools und da kannst du mit der PSShutdown.exe die Datei aufrufen und alle neu starten.

psshutdown @File -r -t 00 (wenn ich mich recht Erinner)

VG
Member: Festus94
Festus94 Jun 30, 2011 at 20:31:13 (UTC)
Goto Top
Hallo,

danke für die schnelle Antwort. Kann ich da auch irgendiwe erreichen, dass erst der DC, dann die Terminalserver, dann ein dritter Server, und dann die ganzen Workstations booten ?


tbnwadm
Member: St-Andreas
St-Andreas Jun 30, 2011 at 20:36:40 (UTC)
Goto Top
Hallo,

ne kleine Batch die die unterschiedlichen Geräte mit unterschiedlichen Wartezeiten für den Shutdown abhandelt.
Member: Festus94
Festus94 Jun 30, 2011 at 20:38:50 (UTC)
Goto Top
Wärst Du so nett, und würdest mir ein Bespiel geben ? Was das Batchen angeht, habe ich nicht wirklich hilfreiche Erfahrungen. ;)


Viele Grüße
tbnwadm
Mitglied: 60730
60730 Jun 30, 2011 at 21:06:34 (UTC)
Goto Top
moinsen,

Zitat von @Festus94:
Hallo,

danke für die schnelle Antwort. Kann ich da auch irgendiwe erreichen, dass erst der DC, dann die Terminalserver, dann ein
dritter Server, und dann die ganzen Workstations booten ?

*hüstel*

Die Reihenfolge ist aber extrem falsch...

  • eine Liste deiner Kisten bekommst du (wenn du die nicht hast) via net view
Und etwas "schöner"
for /f "tokens=1 delims=\ " %a in ('netview') do echo %a>alle_clients.txt
  • Die sortierst du so, wie die Kisten heruntergefahren werden sollen
  • Server am Schluß - nicht am Anfang.....

Zum Thema shutdown Psstools findest du einiges - was das Batchen angeht - eigene Erfahrungen sind das beste - bau was aus den bisherigen Tipps und wenns nicht weitergeht - helfen wir gerne - aber etwas eigenintiative zu sehen ist voraussetzung.

Gruß
Member: jsysde
jsysde Jun 30, 2011 at 21:23:41 (UTC)
Goto Top
Server automatisch/per Skript neu starten?
Ob das mal ne gute Idee ist...

Anyway, in Abhängigkeit von der Anzahl der PCs in deinem Netzwerk bzw. pro Standort kannst du dir ein Problemchen einfangen:
Beim Booten verursachen Rechner Leistungsspitzen im Stromnetz - wenn du also sehr viele PCs und die alle gleichzeitig aus- und wieder angehen, könntest du dir damit die Sicherung(en) rausschiessen. Zumindest haben wir das bei uns in einer Laborumgebung schon mal hinbekommen. face-wink

Cheers,
jsysde
Member: 2hard4you
2hard4you Jun 30, 2011 at 21:38:29 (UTC)
Goto Top
Zitat von @Festus94:
Hallo,

danke für die schnelle Antwort. Kann ich da auch irgendiwe erreichen, dass erst der DC, dann die Terminalserver, dann ein
dritter Server, und dann die ganzen Workstations booten ?


tbnwadm

Moin,

nenne doch mal bitte einen vernüftigen Grund, warum Du das willst

Danke & Gruß

24
Member: Festus94
Festus94 Jul 01, 2011 at 12:40:24 (UTC)
Goto Top
Hallo,

danke für die Tipps.

Die Reigenfolge hatte ich ausgewählt, da alle Clients (die laufen) neu gestartet werden sollen, um Änderungen in der Domäne zu übernehmen. Daher auch der DC als Erster, dann die Terminalserver, usw. ;)

Das Skript soll nur ablaufen, wenn ich es ausführe - was hoffentlich eine Seltenheit darstellt. Es ist auch eher nur für den Fall gedacht...

Das mit dem Stromnetzt sollte kein Problem darstellen, aber danke für den Tipp !


Viele Grüße
tbnwadm
Mitglied: 21277
21277 Jul 01, 2011 at 12:56:17 (UTC)
Goto Top
läuft der DNS Server auf dem DC? Wenn ja sollte die als letztes rebootet werden. Ansonsten können evtl. die Namen nicht mehr aufgelöst werden. Es sei du verwendest die IP Adressen. Was aber auch wieder schlecht ist wenn Du die IPs per DHCP vergibst. Allerding weiss ich auch nicht warum du das machen willst?

Gruss

Micha
Member: Festus94
Festus94 Jul 01, 2011 at 13:25:34 (UTC)
Goto Top
Ich hatte einfach vor mir ein solches Skript zu basteln, für den Fall, dass mal Änderungen gemacht werden, die den Neustart aller Clients vorraussetzen. Also auch noch die Server dabeipacken - wenn schon, denn schon...

Ich habe DHCP im Einsatz, daher würde ich gerne die Hostnamen verwenden. Der DNS läuft auf dem Router.


tbnwadm
Member: BigWim
BigWim Jul 01, 2011 at 13:33:36 (UTC)
Goto Top
Hallo,

Daher auch der DC als Erster, dann die Terminalserver, usw. ;)
Wenn der DC als Erster booten muß(?), dann manuelle von Hand. Warten bis der wieder da ist, dann weiter machen

Das Skript soll nur ablaufen, wenn ich es ausführe - was hoffentlich eine Seltenheit darstellt.
Dann würde ich keinen Aufwand treiben. Wie vorgeschlagen, die Listen anlegen und diese für shutdown /i nutzen (Cut & Paste).

Gruß
Markus
Mitglied: 60730
60730 Jul 01, 2011 at 14:37:48 (UTC)
Goto Top
Moin,

Der DNS läuft auf dem Router.

das ist nicht dein Ernst?
Member: Festus94
Festus94 Jul 01, 2011 at 14:55:36 (UTC)
Goto Top
Zitat von @60730:
das ist nicht dein Ernst?

Doch, eigentlich schon, wieso ? Es funktioniert alles.


Viele Grüße
tbnwadm
Member: Festus94
Festus94 Jul 01, 2011 at 14:56:49 (UTC)
Goto Top
@Markus: Danke, dann werde ich das wohl so machen. Das mit dem DC wollte ich nur so machen, weil ich mir hab' sagen lassen, dass die Verbindungen aller Clients (und der abhängigen Server) dann praktisch "ungültig" wären, da die IPs ggf. nicht mehr akzeptiert werden, Folder Redirections nicht übernommen werden, etc.


tbnwadm
Member: 2hard4you
2hard4you Jul 01, 2011 at 18:56:04 (UTC)
Goto Top
naja, genauer sind es die Kerberostickets, die ungültig werden....
Member: Festus94
Festus94 Jul 02, 2011 at 12:33:59 (UTC)
Goto Top
Genau das war's.


tbnwadm
Member: Xaero1982
Xaero1982 Jul 02, 2011 at 13:47:57 (UTC)
Goto Top
Zitat von @Festus94:
> Zitat von @60730:
> ----
> das ist nicht dein Ernst?

Doch, eigentlich schon, wieso ? Es funktioniert alles.


Viele Grüße
tbnwadm

Das würde ich mal bezweifeln face-smile

VG
Member: Scanner
Scanner Jul 08, 2011 at 12:03:29 (UTC)
Goto Top
Hallo zusammen, ich habe zwar nicht alles gelesen, aber ich würde das so machen.

Script 1
' +++ Sucht alle Computer in der Domaene und speichert sie in einer Datei
' +++ dsquery computer <- findet alle Computer im Activ Directory
' +++ -limit 200 <-- Das Standart limit liegt bei 100 Einträgen.
' +++ da wir in der Domaene ca. 150 Rechner haben wird es mit
' +++ diesen Befehl auf 200 heraufgesetzt.
' +++ -o rdn <-- Nur der Computername wir ausgegeben
str_run = "dsquery computer -limit 200 -O rdn > Computer_in_Domaene.txt"
set wshell = CreateObject("WScript.Shell")
' +++ Startet eine DOS Box und führt dann dort den Eintrag in str_run aus.
' +++ /c fuert den Befehl/ befehle aus und endet dann.
wshell.Run "%ComSpec% /c " & str_run,,True
Set wshell = nothing

' +++ Aufruf des Dateihandlings um die Server aus der Liste zu entfernen
Set wshShell = WScript.CreateObject ("WSCript.shell")
wshshell.run ("Dateihandling.vbs")
Set wshell = Nothing


Sript 2
Hinweis: die Datei Server.txt wurde manuell erstellt, in ihr stehen die Namen der Server / Clients die nicht angefasst werden sollt

'+++ Variablen Deklaration
Dim objFs1, objFs2, objFs3 ' FileSystemObject Objekt
Dim strDateiname1, strDateiname2, strDateiname3
Dim strMaschines, strServer
Dim objTextStream1, objTextStream2, objTextStream3 ' Textstream Objekt
Dim strBoolean

' +++ FileSystemObjecte anlegen
Set objFs1 = CreateObject("Scripting.FileSystemObject")
Set objFs2 = CreateObject("Scripting.FileSystemObject")
Set objFs3 = CreateObject("Scripting.FileSystemObject")

'+++ Datei Pfade und Namen deklarieren
'+++ 1 fuer die Computer in der Domaene, 2 fuer die Serverliste
'+++ 3 ist fuer die Aufnahme der Workstations in der domaene
strDateiname1 = "Computer_in_Domaene.txt"
strDateiname2 = "Server.txt"
strDateiname3 = "Workstation.txt"


' +++ Textstream oeffnen, erlaubt Zugriff auf den Inhalt der Datei
' +++ objTextStream1 = Computer in Domaene
Set objTextStream1 = objFs1.OpenTextFile(strDateiname1,1)

'+++ Datei zur Aufnahme der Workstations erstellen
Set objTextStream3 = objFs3.CreateTextFile(strDateiname3, 8)


'+++Computerliste durchlaufen und kontrollieren ob es ein Server ist.
'+++ Wenn es kein server ist, dann in die Workstaton Datei eintragen
While Not objTextStream1.AtEndOfStream
strBoolean = False
strMaschines = objTextStream1.ReadLine

' +++ Textstream oeffnen, erlaubt Zugriff auf den Inhalt der Datei
' +++ objTextStream2 = Server
Set objTextStream2 = objFs2.OpenTextFile(strDateiname2,1)

While Not objTextStream2.AtEndOfStream
strServer = objTextStream2.ReadLine
If strMaschines = strServer Then
strBoolean = True
End if

Wend
'+++ Schliessen um ihn zu leeren
objTextStream2.Close

'+++ wenn es kein Server ist dann ab damit in die datei.
If strBoolean = False Then
'+++ Computer in Workstationliste eintragen
'+++ erst den text formatiern und die " entfernen.
'+++ dann den String mit einen Zeilenumbruch in Datei schreiben:
strMaschines = Replace(strMaschines, Chr(34), "")
objTextStream3.Write strMaschines & vbCrLf
End If

Wend


' +++ Textstream schliessen
objTextStream3.Close
objTextStream1.Close

' +++ Resourcen freigeben
Set objTextStream1 = Nothing
Set objTextStream2 = Nothing
Set objTextStream3 = Nothing
Set objFs1 = Nothing
Set objFs2 = Nothing
Set objFs3 = Nothing

' +++ Aufruf des Shutdon progs um alle Rechner die Online sind runter zu fahren.
Set wshShell = WScript.CreateObject ("WSCript.shell")
wshshell.run ("shutdown_online.vbs")

Set wshshell = nothing

Script 3:schaun welcher der Kisten an ist (pingen)
'+++ Variablen deklaration
Dim objFs1, objFs2 '+++ FileSystemObject Objekt
Dim strDateiname1, strDateiname2
Dim objTextStream1, strMaschines '+++ Textstream Objekt
Dim str_run '+++ Zur Aufnahme eines DOS Box Befehls
Dim i '+++ Zaehler zur Kontrolle ob ein Rechner Online ist.
i=0 '+++ Zaehler


'+++ Datei Pfade und Namen deklarieren
'+++ 1 = Die Rechner die online bzw aktive sind
'+++ 2 = Alle Workstations in der Domäne
strDateiname1 = "online.txt"
strDateiname2 = "Workstation.txt"

' +++ FileSystemObjecte anlegen
Set objFs1 = CreateObject("Scripting.FileSystemObject")
Set objFs2 = CreateObject("Scripting.FileSystemObject")

'+++ Textstream oeffnen, erlaubt Zugriff auf den Inhalt der Datei
'+++ 1 = Die Rechner die online sind
'+++ 2 = Alle Workstations in der Domäne

Set objLogFile = objFS1.CreateTextFile(strDateiname1,8)
Set objTextStream1 = objFs2.OpenTextFile(strDateiname2,1)

While Not objTextStream1.AtEndOfStream

strMaschines = objTextStream1.ReadLine

'+++ Pingen um heraus zu bekommen ob der Rechner online ist
Set objPing = GetObject("winmgmts:{impersonationLevel=impersonate}")._
ExecQuery("select * from Win32_PingStatus where address = '"_
& strMaschines & "'")

'+++ Wenn der Rechner an ist, kommt er in die Online Datei
For Each objStatus in objPing
If objStatus.StatusCode=0 Then
objLogFile.Write(strMaschines & VbCrLf)
i=1 '+++ Merker, das mind. ein Rechner online ist.
End If
Next

Wend

'+++ Kontrolliert ob ueberhaupt ein Rechner online war.
'+++ Wenn nicht wird eine Bemerkung in die Datei geschrieben und alles Beendet.
if i=0 then
'+++ Durchlauf wenn kein Rechner Online war

'+++ Bemerkung in die Datei schreiben
objLogFile.Write("Keine Computer Online!" & VbCrLf)

'+++ Stream schliessen
objTextStream1.Close
objLogFile.Close

'+++ Dateihaendling
Set wshell = WScript.CreateObject("WScript.Shell")
'+++ Benennt die Online Dateim zur Doku um.
str_run = "ren online.txt online_%date%.txt"
'+++ Startet eine DOS Box und führt dann dort den Eintrag in str_run aus.
wshell.Run("%ComSpec% /c " & str_run)
'+++ Nicht mehr benoetigte Datei Loeschen
str_run = "del Computer_in_Domaene.txt"
wshell.Run("%ComSpec% /c " & str_run)
'+++ Nicht mehr benoetigte Datei Loeschen
str_run = "del Workstation.txt"
wshell.Run("%ComSpec% /c " & str_run)


'+++ Objekte freigeben
Set objFs1 = Nothing
Set objFs1 = Nothing
Set wshshell = Nothing

Else
'+++ Wird durchlaufen wenn mind. 1 Rechner online war.

'+++ Stream schliessen
objTextStream1.Close
objLogFile.Close

'+++ Objekte freigeben
Set objFs1 = Nothing
Set objFs1 = Nothing

'+++ Aufruf des shutdown Progs
Set wshShell = WScript.CreateObject ("WSCript.shell")
str_run ="C:\XXX\shutdown.bat"
wshShell.run ("%ComSpec% /c " & str_run)

Set wshShell = nothing

End if


Und nun die Bat Datei


Sleep5min.vbs
psshutdown @online.txt -c -m "Ihr PC wird von blablabla herruntergefahren. (Tel.xxxxxxx)" -t 1800 >> Doku.txt

Sleep5min.vbs

del Computer_in_Domaene.txt
del Workstation.txt
ren online.txt online_%date:~0,2%%date:~3,2%%date:~6,4%.txt
ren Doku.txt Doku_%date:~0,2%%date:~3,2%%date:~6,4%.txt

So fahre ich alle clients in der Domaäne herrunter, zum reeboot musst du nur den psshutdown eintrag anpassen.
Dann hasst du alles schön sauber Dokumentiert.
Durch die vielen Kommentare müste das ganze selbsterklärend sein.
Ss gibt bestimmt bessere Lösungen, aber so mach ich es halt.
Member: Festus94
Festus94 Jul 08, 2011 at 12:38:21 (UTC)
Goto Top
Danke für den Tipp ! Ich werde es bei Gelegenheit mal ausprobieren.


tbnwadm