Hallo,
vielleicht gibt es ja außer mir noch andere, die sich ärgern dass es unter Windows keinerlei eingebaute Möglichkeit gibt, Befehle auf anderen Rechnern im Netzwerk auszuführen. Mich hat das immer gestört und ich wollte mir auch keine Zusatzsoftware auf den Clients installieren müssen, die ständig im Hintergrund laufen sollte.
In meinem Fall ging es darum, dass ich beim Drücken des „Abwesend“-Schalters wirklich alles ausschalten wollte, was noch im Haus eingeschaltet ist. Auch mein Notebook sollte, sofern es im WLAN ist und läuft, ausgeschaltet werden.
Nun wird sich ein Windowserfahrener Mensch wundern, warum ich nicht einfach den Befehl
shutdown -s \\192.168.0.196 -f
benutzt habe, der ja genau das tun würde: Den Rechner „notebook“ im Netzwerk herunterfahren, sofern die entsprechenden Rechte vorhanden sind.
Leider is das aber nicht die Art wie ich mein Notebook normalerweise herunterfahre. Stattdessen bevorzuge ich den Ruhezustand, weil man aus diesem wesentlich schneller wieder hochfahren kann (keine „Bill-Gates-Gedenkminute“) und zudem offene Anwendungen erhalten bleiben und man einfach da weiterarbeiten kann, wo man aufgehört hat.
Also brauchte ich zunächst eine Möglichkeit, den Rechner per Kommandozeile bzw. Programmaufruf in den Ruhezustand zu versetzen und dann noch einen Weg, dies von einem anderen Rechner aus auszulösen.
Im Internet wurde ich, was den Ruhezustand betrifft, schnell fündig. Der Befehl
c:\windows\system32\rundll32.exe powrprof.dll,SetSuspendState Hibernate
tut, beispielsweise in einer Datei shutdown.cmd auf dem herunterzufahrenden Rechner verpackt, genau dies. Doch wie führe ich sie von einem entfernten Rechner aus?
Das einzige Mittel, mit dem man den Start eines Programms auf einem anderen Rechner im Netzwerk auslösen kann und das bei Windows XP von Haus aus an Bord ist, ist der Taskplaner. Folgendes Skript hilft weiter (.vbs - Visual Basic Script):
Set objShell = WScript.CreateObject("WScript.Shell")
objShell.exec "at \\192.168.0.196 " + FormatDateTime(time + #00:02:30#, 4) + " /interactive " + chr(34) + "c:\windows\hibernate.cmd" + chr(34)
Das Skript ist natürlich ein Notbehelf, da es das Programm nicht sofort ausführt, sondern erst nach zweieinhalb Minuten. Der Grund hierfür ist, dass mögliche Synchronisationsfehler der beiden Systemuhren berücksichtigt werden müssen und der Task genau in dem Moment ausgeführt wird, in dem die Systemuhr auf die angegebene Zeit wechselt - allerdings ist die Auflösung nur minutengenau. Also muss man den Anfang der gewünschten Minute „erwischen“… Das Skript veranlasst den angesprochenen Rechner, um die aktuelle lokale Systemzeit plus zweieinhalb Minuten das entsprechende Skript auszuführen. Würde man einen zu geringen zeitlichen „Sicherheitsabstand“ wählen könnte es passieren, dass die Uhr des Zielrechners schon „weiter“ ist und das Skript nicht wie gewünscht, sondern erst am nächsten Tag ausgeführt wird.
Was ist zu beachten? Zunächst einmal müssen natürlich die entsprechenden Zugriffsrechte bestehen. Der IPS-Rechner muss also auf den Zielrechner zugreifen dürfen. Ich habe aus diesem Grunde den IPS-Dienst unter einem entsprechenden Account ausgeführt. Dann muss man selbstredend Pfad- und IP-Adressen anpassen. Ich verwende die IP anstelle des Hostnamens weil letzteres bei mir zwischen WLAN und LAN aus unerfindlichen Gründen nicht funktioniert. Wichtig ist dann natürlich, dass man dem entsprechenden Rechner per DHCP eine feste IP zugeordnet hat.
Wenn man will kann man das Skript noch verfeinern indem man z.B. die Übergabe eines Parameters erlaubt und die Datei auf dem Zielrechner im Skript selbst erzeugt. So könnte man ein Skript erzeugen, das auf dem Remotesystem einen „beliebigen“ als Parameter zu übergebenden Befehl ausführt. In meinem Fall reichte jedoch das hier gezeigte Beispiel aus.