WMI Dienststatus abfragen

  • Hallo zuammen

    ich habe von UEZ ein Script gefunden welches einen Dienst auf einem Remote Computer stoppt.

    Kann mir bitte jemand weiterhelfen um in dem Script vorher zu prüfen welcher Status der Service (gestartet) hat.

    Wenn der Service nicht gestartet ist soll das Script den Service starten.

    [autoit]

    ;Coded by UEZ 2009
    #AutoIt3Wrapper_Change2CUI=y
    #AutoIt3Wrapper_UseUpx=n
    $oMyError = ObjEvent("AutoIt.Error", "oMyError") ; Install a custom error handler
    Global $ip = "localhost"
    If $CmdLine[0] > 0 Then $ip = $CmdLine[1]
    $stop_srv = "RemoteRegistry"
    If Stop_Service($ip, $stop_srv) Then
    MsgBox(0, "Stop Service", "Service " & $stop_srv & " stopped properly on " & $ip)
    Else
    MsgBox(16, "Error", "Error")
    EndIf
    Func Stop_Service($srv, $service, $sUsr = "", $sPass = "")
    Local $colItems, $colItem, $ping, $objWMILocator, $objWMIService
    $ping = Ping($srv)
    If $ping Then
    $objWMILocator = ObjCreate("WbemScripting.SWbemLocator")
    If @error Then Return SetError(3, 0, 0)
    $objWMIService = $objWMILocator.ConnectServer($srv, "\root\cimv2", $sUsr, $sPass, "", "", 128)
    If @error Then Return SetError(4, 0, 0)
    $colItems = $objWMIService.ExecQuery("Select * From Win32_Service Where Name='" & $service & "'")
    If IsObj($colItems) Then
    For $objItem In $colItems
    $objItem.StopService()
    Next
    Return 1
    Else
    Return SetError(1, 0, 0)
    EndIf
    EndIf
    Return SetError(2, 0, 0)
    EndFunc
    Func oMyError()
    Msgbox(0,"AutoItCOM Test","We intercepted a COM Error !" & @CRLF & @CRLF & _
    "err.description is: " & @TAB & $oMyError.Description & @CRLF & _
    "err.windescription:" & @TAB & $oMyError.WinDescription & @CRLF & _
    "err.number is: " & @TAB & Hex($oMyError.Number, 8) & @CRLF & _
    "err.lastdllerror is: " & @TAB & $oMyError.LastDllError & @CRLF & _
    "err.scriptline is: " & @TAB & $oMyError.Scriptline & @CRLF & _
    "err.source is: " & @TAB & $oMyError.Source & @CRLF & _
    "err.helpfile is: " & @TAB & $oMyError.Helpfile & @CRLF & _
    "err.helpcontext is: " & @TAB & $oMyError.HelpContext _
    )
    EndFunc

    [/autoit]

    Einmal editiert, zuletzt von johny1099 (23. Mai 2013 um 19:51)

  • Du musst nur den Status des Objekts abfragen, siehe lokales Beispiel unten. Je nach Status dann eben entscheiden ob der Service gestartet/gestoppt werden soll oder nicht.

    [autoit]


    $objWMIService = ObjGet('winmgmts:\\.\root\cimv2')
    $colItems = $objWMIService.ExecQuery("Select * From Win32_Service")
    If IsObj($colItems) Then
    For $objItem In $colItems
    ConsoleWrite($objItem.Name & " --> " & $objItem.State & @CRLF)
    ;$objItem.StopService()
    Next
    EndIf

    [/autoit]

    Weiter Infos zu den "Service Objekten", siehe auch hier:
    http://msdn.microsoft.com/en-us/library/…v=vs.85%29.aspx

  • Kannst das aber btw auch gleich ins Query packen:

    [autoit]

    $colItems = $objWMIService.ExecQuery("Select * From Win32_Service where name='eventlog' AND state='Stopped'")

    [/autoit]