nagita
Goto Top

Windows Dienste abfragen

Hallo an Alle

ich hatte das gleiche Thema schon für PHP
Dort war die Frage:
kann man mit PHP den Status eines Windows-Dienstes abfragen?
Bei VB soll es wohl gehen.
Ich hätte es aber lieber in PHP

Lösung:
<?php
$service = "Spooler";  
if (preg_match('/STATE\s*:\s*\d+\s*([^\s]+)/i',shell_exec("sc query $service"),$matches)){  
	$state = $matches[1];
	echo $state;	
}
?>
oder
<?php
$service = "Spooler";  
echo shell_exec("powershell -EP Bypass (get-service $service).Status");  
?>

Funktioniert hervorragend

Habe dann versucht etwas ähnliche für VB zu finden.
Gefunden habe ich das hier:

Sub Dtest()

   Dim RetVal
   Dim Service = "mysql"  
   RetVal = Shell("sc query " & service, 1)  

   msgbox "Dienst " & Service & " = " & RetVal  

End sub

Als Ergebnis wird mir aber nur eine Zahl angezeigt, die jedesmal anders ist.
Weiß da jemand, wie ich als Ergebnis bekomme, ob der Dienst öläuft oder nicht?

Content-Key: 667475

Url: https://administrator.de/contentid/667475

Printed on: April 16, 2024 at 14:04 o'clock

Member: colinardo
colinardo Jun 10, 2021 updated at 13:35:08 (UTC)
Goto Top
Servus,
WMI ist hier dein Freund

VBA
Function GetServiceState(svc As String) As String
    Dim services, objService
    Set services = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2").ExecQuery("Select State from Win32_Service where Name = '" & svc & "'")  
    For Each objService In services
        GetServiceState = objService.State
    Next
End Function

Sub DeineSub()
    MsgBox GetServiceState("mysql")  
End Sub
VBS
Function GetServiceState(svc)
    Dim services, objService
    Set services = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2").ExecQuery("Select State from Win32_Service where Name = '" & svc & "'")  
    For Each objService In services
        GetServiceState = objService.State
    Next
End Function

MsgBox GetServiceState("mysql")  
Grüße Uwe
Member: nagita
nagita Jun 10, 2021 at 09:55:48 (UTC)
Goto Top
Top
Danke
Member: nagita
nagita Jun 14, 2021 at 08:53:10 (UTC)
Goto Top
Das hat alles sehr schön geklappt. Danke dafür.
Hab jetzt aber zum gleichen Thema eine zusätzliche Frage.
Kann ich einen Dienst mit VB stoppen und wieder starten?
Habe ein paar Sachen, die ich bei Google gefunden habe, ausprobiert.
Aber nichts funktioniert.
Mein Grund ist, dass es einen Dienst gibt, der
automatisch läuft und regelmäßig ausgeführt wird.
Also egal, ob in Ausführung oder nicht, es wird immer Running zurückgegeben.
Am Besten wäre es, wenn ich feststellen kann, ob der Dienst gerade ausgeführt wird.
Wenn nicht, möchte ich ihn stoppen, etwas Anderes ausführen, und ihn danach wieder starten.
Member: colinardo
colinardo Jun 14, 2021 updated at 09:41:41 (UTC)
Goto Top
Servus nochmal.
Kann ich einen Dienst mit VB stoppen und wieder starten?
Natürlich
Du hättest einfach nur mal in die Doku der Win32_Service WMI Klasse schauen müssen, dann hättest du dort sehen können das das Object eine StartService() und StopService() Methode besitzt und du das so ganz einfach oben anpassen hättest können indem du stattdessen nur die obigen Methoden aufgerufen hättest face-wink.
Daran denken das der Account der das Skript ausführt über ausreichend Rechte dazu hat den Dienst zu Starten und zu Stoppen!

Beispiel (VBA)
Function SetServiceState(svc As String, state As String) As Integer
    Dim services, objService
    Set services = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2").ExecQuery("Select State from Win32_Service where Name = '" & svc & "'")  
    For Each objService In services
        If LCase(state) = "stop" Then  
            objService.StopService
        ElseIf LCase(state) = "start" Then  
            SetServiceState = objService.StartService
        End If
    Next
End Function

Function GetServiceState(svc As String) As String
    Dim services, objService
    Set services = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2").ExecQuery("Select State from Win32_Service where Name = '" & svc & "'")  
    For Each objService In services
        GetServiceState = objService.state
    Next
End Function


Sub DoSomeWork()
    Dim service As String, retVal As Integer
    ' Dienstname  
    service = "Spooler"  
    ' checke ob Dienst läuft  
    If GetServiceState(service) = "Running" Then  
        ' stoppe Service  
        retVal = SetServiceState(service, "stop")  
        ' Checke Service  
        If retVal = 0 Or retVal = 10 Then
            ' hier tue irgend etwas  
            MsgBox "Stopping Service finished", vbInformation  
            
            ' starte Service  
            retVal = SetServiceState(service, "start")  
            If retVal = 0 Or retVal = 10 Then
                MsgBox "Service " & service & " is running again.", vbInformation  
            Else
                MsgBox "Error starting service  " & service & " | ErrorCode: " & retVal, vbExclamation  
            End If
        Else
            MsgBox "Stopping service  " & service & " failed with Error: " & retVal, vbExclamation  
        End If
    Else
        MsgBox "Service " & service & " is not running", vbExclamation  
        retVal = SetServiceState(service, "start")  
    End If
End Sub
Grüße Uwe
Member: nagita
nagita Jun 15, 2021 at 06:03:00 (UTC)
Goto Top
Es hat sich inzwischen herausgestellt, dass ich den Dienst nicht stoppen oder starten muss.
Der entsprechende Dienst steht auf automatisch und wird ausgeführt.
Allerdings ist er nur alle 5 Minuten aktiv.
Steht aber die ganze Zeit auf Running.
Kann ich mit VB checken, ob dieser Dienst gerade aktiv ist?
State wird ja die ganze Zeit als Running angezeigt.
Gibt es da noch einen anderen Wert, den ich abfragen kann?
Ich habe versiucht, etwas dazu zu finden, leider aber nichts gefunden.
Member: colinardo
colinardo Jun 15, 2021 updated at 08:28:50 (UTC)
Goto Top
Da du leider zu wenig Infos zum Dienst lieferst bliebe mir hier nur noch der Hinweis den Prozess des Dienstes auf Vorhandensein/Reaktion zu prüfen. Selbes Verfahren wie oben via WMI Abfrage, nur eben die Klasse auf Win32_Process abwandeln und die Property Name im WQL Clause auf den Prozessnamen filtern . Ist das Ergebnis Nothing dann gibt es keinen solchen Prozess und darauf kannst du dann mittels IF Abfrage reagieren.
Beispiel liefere ich diesmal nicht weil du ja sowieso
gleich wieder mit was neuem kommst, die Zeit erspar ich mir hier.