Remote Shutdown per WMI

  • Versuche folgendes Skript ans laufen zu bringen.

    Spoiler anzeigen
    [autoit]

    ; #FUNCTION# ====================================================================================================================
    ; Name...........: RemoteShutdown
    ; Description ...: Fährt einen (Remote)Computer herunter
    ; Syntax.........: RemoteShutdown($sComputer, $iShutdownOption, $sUser, $sPassword[, $sDomain])
    ; Parameters ....: $sComputer - Computername
    ; $iShutdownOption - Art des Herunterfahrens, siehe Remarks
    ; $sUser - Benutzerkonto mit administrativen Rechten
    ; $sPassword - Passwort des Benutzers
    ; $sDomain - Optional: Domäne der der Benutzer angehört, falls nciht angegeben wird $sComputer benutzt
    ; Return values .: Success - 1
    ; Failure - 0, sets @error to:
    ; |1 - Fehler beim Erstellen eines SWbemLocator-Objektes
    ; |2 - Fehler beim Verbinden zum Computer
    ; |3 - Fehler beim Erstellen eines WMI-Objektes
    ; |4 - Die WMI-Abfrage lieferte ein leeres Ergebnis zurück
    ; |5 -
    ; Author ........: Bitboy
    ; Modified.......:
    ; Remarks .......: Mögliche Parameter für $iShutdownOption sind (identisch zur AutoIt-Funktion "Shutdown"):
    ; 0 - Abmelden
    ; 4 - Abmelden erzwingen (0 + 4)
    ; 1 - Herunterfahren
    ; 5 - Herunterfahren erzwingen (1 + 4)
    ; 2 - Neustart
    ; 6 - Neustart erzwingen (2 + 4)
    ; 8 - Ausschalten
    ; 12 - Ausschalten erzwingen (8 + 4)
    ;
    ; Port 135 TCP darf auf dem Zielsystem nicht durch eine Firewall blockiert werden
    ; Link ..........: http://msdn.microsoft.com/en-us/library/…v=VS.85%29.aspx
    ; ===============================================================================================================================
    Func RemoteShutdown($sComputer, $iShutdownOption, $sUser, $sPassword, $sDomain="")
    Local $objSWbemLocator, $objSWbemServices, $objWMIService, $colItems, $objItem

    [/autoit] [autoit][/autoit] [autoit]

    If $sDomain = "" Then $sDomain = $sComputer

    ;Verbindung zum lokalen Computer führt zu Fehler
    If $sComputer <> @ComputerName Then
    $objSWbemLocator = ObjCreate("WbemScripting.SWbemLocator")
    If @error Then Return SetError(1,0,0)
    $objSWbemServices = $objSWbemLocator.ConnectServer($sComputer, "root\CIMV2", $sDomain & "\" & $sUser, $sPassword)
    If @error Then Return SetError(2,0,0)

    [/autoit] [autoit][/autoit] [autoit]

    $objSWBemServices.Security_.ImpersonationLevel = 3
    EndIf

    $objWMIService = ObjGet("winmgmts:\\" & $sComputer & "\root\CIMV2")
    If @error Then Return SetError(3,0,0)

    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_OperatingSystem", "WQL", 0x10 + 0x20)

    [/autoit] [autoit][/autoit] [autoit]

    If IsObj($colItems) Then
    For $objItem In $colItems
    Return $objItem.Win32Shutdown($iShutdownOption)
    Next
    Else
    Return SetError(4,0,0)
    EndIf
    EndFunc

    [/autoit]

    Leider "stürzt" es immer mit folgender Fehlermeldung ab:
    Neu AutoIt v3 Script (2).au3 (40) : ==> The requested action with this object has failed.:
    $objSWbemServices = $objSWbemLocator.ConnectServer($sComputer, "root\CIMV2", $sDomain & "\" & $sUser, $sPassword)
    $objSWbemServices = $objSWbemLocator.ConnectServer($sComputer, "root\CIMV2", $sDomain & "\" & $sUser, $sPassword)^ ERROR

    Dazu hab ich 2 Fragen
    1) Wie fängt man den Fehler sauber ab?
    2) Wieso funktioniert das nicht?

  • Also kannst du mal beschreiben wie das Problem entsteht?
    Ich habe noch keine Parameter eingegeben,aber ich denke es würde uns helfen wenn du uns Schritt für Schritt beschreibst wie du vorgehst.
    Am besten dein Script mit posten und #requireadmin nicht vergessen.

  • RemoteShutdown("my_pc", 0, "user", "passwort"); wenn man den Namen hat !!!
    RemoteShutdown("15.15.15..201", 0, "user", "passwort"); wenn man die IP hat? Geht nicht, oder?

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Also bei mir funktioniert es auch nicht ! Gleicher Fehler wie bei Bitboy.

    Keine Domäne, sondern in einer Arbeitsgruppe unter Win XP 32bit. Auch ohne Firewall nicht.

    Edit: Lokal geht es auch nicht. Dann bricht er in der Zeile "Return $objItem.Win32Shutdown($iShutdownOption)" mit einem Fehler ab.

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

  • Hab bis jetzt immer noch keine Lösung, habe allerdings auf irgendeiner Seite gelesen, dass die Remote-WMI Funktionen wegen Sicherheitsbedenken wohl stark eingeschränkt worden sind und dementsprechend nur mit einigem Konfigurationsaufwand wieder "aktiviert" werden können.

    Werde daher wohl auf das Programm "shutdown.exe" im system32 Ordner ausweichen. Das funktioniert auf Anhieb.
    (Leider ist das Fehlerhandling bei externen Kommandozeilen Programmen recht aufwendig)


    Ich denke, dass der Code prinzipiell richtig ist, hab ein Beispiel für VB umgeschrieben.

  • könnte ich. Hatte aber eine Lösung ohne externe Programme im Sinn. psshutdown und shutdown haben ein fast identisches Verhalten, daher scheints mir sinnvoller dass programm zu nehmen was schon bei windows dabei ist.

  • Bitboy.


    Hier hast Du.Du musst bei der Verwendung von COM eine Fehlerbehandlung implementieren.


    Spoiler anzeigen
    [autoit]

    $objCOMError = ObjEvent('AutoIt.Error', '_COMErrFunc')

    Func _RemoteShutdown($p_sComputer, $p_iShutdownOption, $p_sUser = '', $p_sPassword = '')
    Local $objSWbemLocator
    Local $objLocalSWbemService
    Local $objSWbemService
    Local $colItems
    Local $objItem
    $objSWbemLocator = ObjCreate('WbemScripting.SWbemLocator')
    If @error Then Return SetError(1, 0, 'FEHLER: Locatorobjekt konnte nicht erstellt werden!')
    $objLocalSWbemService = $objSWbemLocator.ConnectServer('', 'root/cimv2')
    If @error Then Return SetError(2, 0, 'FEHLER: Verbindung zum lokalen WMI-Server konnte nicht hergestellt!')
    If $p_sComputer <> @ComputerName Then
    If $p_sUser <> '' Then
    $objSWbemService = $objSWbemLocator.ConnectServer($p_sComputer, 'root/cimv2', $p_sUser, $p_sPassword)
    If @error Then Return SetError(3, 0, 'FEHLER: Verbindung zum Remote-Server konnte nicht hergestellt!')
    Else
    $objSWbemService = $objSWbemLocator.ConnectServer($p_sComputer, 'root/cimv2')
    If @error Then Return SetError(3, 0, 'FEHLER: Verbindung zum Remote-Server konnte nicht hergestellt!')
    EndIf
    Else
    $objSWbemService = $objSWbemLocator.ConnectServer('', 'root/cimv2')
    If @error Then Return SetError(3, 0, 'FEHLER: Verbindung zum lokalen Server konnte nicht hergestellt!')
    EndIf
    $objLocalSWbemService.Security_.impersonationlevel = 3
    If @error Then Return SetError(4, 0, 'FEHLER: Sicherheitsstufe konnte nicht eingestellt werden!')
    $objSWbemService.Security_.impersonationlevel = 3
    If @error Then Return SetError(4, 0, 'FEHLER: Sicherheitsstufe konnte nicht eingestellt werden!')
    $colItems = $objSWbemService.ExecQuery('SELECT * FROM Win32_OperatingSystem', 'WQL', 0x10 + 0x20)
    If IsObj($colItems) Then
    For $objItem In $colItems
    Return $objItem.Win32Shutdown($p_iShutdownOption)
    Next
    Else
    Return SetError(5, 0, 'FEHLER: WMI-Abfrage liefert leeres Ergebnis!')
    EndIf
    EndFunc ;==>_RemoteShutdown
    Func _COMErrFunc()
    SetError(1)
    EndFunc ;==>_COMErrFunc

    [/autoit]