Dienst (Service) Monitoring Tool

  • Hallo Gleichgesinnte,

    ich möchte eine GUI schreiben, welche mir den Windows Update-Dienst überwacht.

    Spoiler anzeigen

    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 476, 96, 192, 124)
    $input= GUICtrlCreateLabel("", 96, 32, 105, 21)
    $Label1 = GUICtrlCreateLabel("Windows Update", 16, 32, 66, 17)
    $Start = GUICtrlCreateButton("Start", 216, 32, 97, 25, $WS_GROUP)
    $Stop = GUICtrlCreateButton("Stop", 328, 32, 113, 25, $WS_GROUP)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###


    Func _RetrieveServiceState($s_Machine, $s_ServiceName)
    Local Const $wbemFlagReturnImmediately = 0x10
    Local Const $wbemFlagForwardOnly = 0x20
    Local $colItems = "", $objItem
    Local $objWMIService = ObjGet("winmgmts:\\" & $s_Machine & "\root\CIMV2")
    If @error Then
    MsgBox(16, "_RetrieveServiceState", "ObjGet Error: winmgmts")
    Return
    EndIf
    $colItems = $objWMIService.ExecQuery ("SELECT * FROM Win32_Service WHERE Name = '" & $s_ServiceName & "'", "WQL", _
    $wbemFlagReturnImmediately + $wbemFlagForwardOnly)
    If @error Then
    MsgBox(16, "_RetrieveServiceState", "ExecQuery Error: SELECT * FROM Win32_Service")
    Return
    EndIf
    If IsObj($colItems) Then
    For $objItem In $colItems
    Return $objItem.State
    Next
    EndIf
    EndFunc ;==>_RetrieveServiceState

    Do
    $service = "wuauserv"
    $input= GUICtrlCreateLabel(" " & _RetrieveServiceState(@ComputerName, $service), 96, 32, 105, 21)
    EndIf
    sleep (3000)
    until 1 = 2


    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit


    Case $Start
    RunWait("net.exe start wuauserv")
    $Input = GUICtrlCreateLabel(" " & _RetrieveServiceState(@ComputerName, $service), 96, 32, 105, 21)

    Case $Stop
    RunWait("net.exe stop wuauserv")
    $Input = GUICtrlCreateLabel(" " & _RetrieveServiceState(@ComputerName, $service), 96, 32, 105, 21)


    EndSwitch
    WEnd


    - Im "$input= GUICtrlCreateLabel("", 96, 32, 105, 21)" Feld soll immer der aktuelle Status stehen, also ob er gestoppt ist oder gestartet.
    - Über die Buttons start und stop möchte ich den Dienst starten und stoppen können, jedoch soll sich der status in "$input= GUICtrlCreateLabel("", 96, 32, 105, 21)" dann auch ändern.

    Wenn ich eine Do - Until oder eine While-Schleife einfüge wird mir zwar der aktuelle status angezeigt, jedoch funktionieren die start-stop-buttons nicht mehr.
    Lasse ich die schleifen weg, funktionieren die buttons, allerdings hat der status dann keinen einfluss wenn ich über cmd den dienst starte oder stoppe dann kriegt der status das nicht mit da keine schleife vorhanden ist :(

    Weis hier jemand weiter ? bitte um hilfe -> D A N K E ...

  • Also erstmal erstellt man ein und das selbe Label nicht mehrfach, insbesondere nicht innerhalb einer Endlosschleife. Das führt nämlich in wenigen Sekunden zu tausenden übereinanderliegenden Labeln und letzten Endes zum Programmabsturz sobald das Limit an maximal erlaubten Controls erreicht wird. Dazu kommt enormes Flackern des controls.

    Wie ändert man den Inhalt eines Labels oder den meisten anderen controls richtig?

    [autoit]


    guictrlsetdata($input,"neuer Text")

    [/autoit]


    Zweitens kann die GUI natürlich niemals auf Eingaben reagieren, wenn man vor der Endlosschleife der GUI eine weitere Endlosschleife platziert.
    Stattdessen gehört die Statusabfrage in die Hauptschleife deines Scriptes. Da ein 3sekündiges sleep in der Hauptschleife zu extremem laggen der GUI führen würde musst du stattdessen einen Timer verwenden. Das ganze würde dann in etwa so ausschaun:


    Spoiler anzeigen
    [autoit]


    global $timer= timerinit()
    global $service = "wuauserv"

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

    while 1

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

    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Start
    RunWait("net.exe start wuauserv")
    ;$Input = GUICtrlCreateLabel(" " & _RetrieveServiceState(@ComputerName, $service), 96, 32, 105, 21)
    guictrlsetdata($input," " & _RetrieveServiceState(@ComputerName, $service))
    Case $Stop
    RunWait("net.exe stop wuauserv")
    ;$Input = GUICtrlCreateLabel(" " & _RetrieveServiceState(@ComputerName, $service), 96, 32, 105, 21)
    guictrlsetdata($input," " & _RetrieveServiceState(@ComputerName, $service))
    EndSwitch

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

    if timerdiff($timer) >= 3000 then
    $data = " " & _RetrieveServiceState(@ComputerName, $service)
    if $data <> guictrlread($input) then guictrlsetdata($input,$data) ; nur wenn sich überhaupt was geändert hat setzten wir den neuen Labeltext, das verhindert ein Flackern des Controls
    $timer = timerinit() ; timer muss wieder auf 0 gesetzt werden
    endif

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

    wend

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