Shutdown & Remote Shutdown [mit besonderer Beachtung von RPD]

Gepostet am: Sep 19, 2012 9:33:21 PM

Wer in einer Terminal Session eine Client-Betriebssystems (wie beispielsweise Windows 7 oder XP) den Client herunterfahren möchte, wird feststellen, dass standardmäßig nur Abmelden, Trennen und Sperren zur Auswahl stehen. 

Serverbetriebssysteme können sich da anders verhalten, je nach Berechtigung und Konfiguration. (Das soll in diesem Fall außer Acht gelassen werden) Welche Möglichkeiten bestehen aber ein Client-Betriebssystem trotzdem herunterzufahren. Eine Möglichkeit wäre natürlich über den Hypervisor (zB Hyper-V ...). Dafür müsste man sich - in den meisten Fällen - erstmal remote auf dem Hyper-V Server einloggen, um dann von dort den Client herunterzufahren. Ein nicht gerade praktikabler Weg.

Möglichkeit 1: shutdown-Befehl

Die erste Möglichkeit, die einem in den Sinn kommen könnte, um das Problem zu lösen ist der Shutdown Befehl:

Dies kann man einerseits lokal auf dem Rechner ausführen, auf dem man sich remote befindet:

Dazu kann man sich beispielsweise eine Batch-Datei erstellen (siehe Anhang "Herunterfahren.zip")

Eine zweite Möglichkeit wäre es den Computer dem Computer, von dem man aus die Remote Session aufgebaut hat, herunterzufahren. Also die virutelle Maschine remote herunterfahren.

Das wird jedoch ohne weitere Einstellung nicht funktionieren. Grund dafür ist, dass der Benutzer, der den Befehl ausführt nicht genügend Rechte für einen Remote Shutdown hat. Daher sind folgende Einstellungen vorzunehmen:

Anmerkung: In einer Domäne funktioniert das erfahrungsgemäß immer; ansonsten kann es hin und wieder zu Problemen kommen - Hinweis fügen Sie den Benutzernamen mit Computername\Benutzer hinzu (Computer ist dabei der Computer, von dem der Computer remote heruntergefahren werden soll. Im optimalsten Fall ist es jedoch eine AD-Gruppe, die die Benutzer beinhaltet, die das dürfen sollen.

Zu guter letzt gibt es noch eine Mischlösung:

Führt dazu, dass man ein Dialogfeld bekommt, mit dem man den sowohl den lokalen Computer herunterfahren kann als auch einen anderen, sofern man dazu berechtigt ist. (siehe Remote Herunterfahren)

Möglichkeit 2: psshutdown

Eine weitere Möglichkeit ist die Verwendung des des Tools "psshutdown" (grundsätzlich kann es für den beabsichtigten Zeck genau das selbe, wie shutdown.exe hat aber mehr Parameter). Da für diesen Anwendungszweck die Verwendung nicht notwendig ist, sei lediglich auf die Technet-Seite verwiesen - hier: http://technet.microsoft.com/en-us/sysinternals/bb897541

Möglichkeit 3: Tastenkürzel

Die Ansätze mit den Batch-Dateien und die Befehlszeilen sind dann sinnvoll, wenn man die Funktion öfters benötigt. Braucht man sie lediglich selten, dann kann man sich mit den folgenden Tastenkürzel helfen.

Möglichkeit 4:Befehl aktivieren (Windows XP only)

Unter Windows XP gab es noch die Möglichkeit den Button manuell zu aktivieren (siehe "Abmelden" und "Beenden" unter XP hinzufügen - http://support.microsoft.com/kb/303070/de) Diese Funktion steht unter Windows 7 nicht mehr zur Verfügung. Auch über die Registry ist mir kein Weg bekannt, das trotzdem zu bewirken - die selben Registry Settings führen jedenfalls nicht zum gewünschten Ergebnis.  

Möglichkeit 5: WMI

Nun zu einer etwas exotischeren Lösung: Über WMI (Windows Management Instrumentation Object).

Das WMI-Objektmodell kann man prinzipiell über alle mir bekannten Programmiersprachen ansprechen. So zum Beispiel über VBS.

VBS

option explicitif msgbox("Do you want to shut down this computer?", 4, "System Shutdown") = 6 then     dim osObj, osColl      const nLogOff=0      const nReboot=2      const nForceLogOff=4      const nForceReboot=6      const nPowerDown=8      const nForcePowerDown=12       Set osColl = GetObject("winmgmts:{(Shutdown)}").ExecQuery("Select * from Win32_OperatingSystem")       For Each osObj in osColl         osObj.Win32Shutdown(nForcePowerDown)     Nextelse     msgBox "Shutdown cancelled",vbOKOnly+vbInformation,"System Shutdown"end if

Das geht natürlich auch Remot (siehe "remote_shutdown_vbs.rar" - Quelle). Beachten Sie auch hierbei die Einstellungen in den Gruppenrichtlinien, da sonst der Befehl nicht funktioniert.

Möglichkeit 6: powershell

Wenn wir schon bei den exotischen Varianten sind, dann auch noch die Powershell-Varianten.

lokalen Computer:

remote Computer

Auch hier kommt es zur Problematik mit den Berechtigungen, sonst kommt es zu folgender Fehlermeldung.

Und dann gäbe es noch die WMI-Methode in der Powershell:

$objServer = gwmi win32_operatingsystem

$objServer.psbase.Scope.Options.EnablePrivileges = $true

$objServer.reboot()

Fazit

Nur bei Windows XP bestand die Möglichkeit den Startmenüeintrag zu aktivieren. Unter Win 7 geht das nicht mehr. Wer es selten benötigt, sollte auf die Tastenkürzel zurückgreifen. Wer es häufiger braucht, sollte sich mittels Batch Datei einen Startmenüeintrag basteln (zB siehe oben). Die Skriptinglösungen (zB VBS & WMI, powershell) sind dann nützlich, wenn man den Shutdown in ein Skript einbindet (zB Remote-Software Installation usw.) oder eine Reihe von PCs (aus einer Textdatei) herunterfahren möchte. Psshutdown bietet meines Wissens nach keine wesentlichen Vorteile gegenüber shutdown.exe. Sollte aber etwas mit shutdown.exe nicht realisierbar sein, dann lohnt vielleicht der Blick in die psshutdown-Doku.

Literatur