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:
oder
Funktioniert hervorragend
Habe dann versucht etwas ähnliche für VB zu finden.
Gefunden habe ich das hier:
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?
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;
}
?>
<?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?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 667475
Url: https://administrator.de/contentid/667475
Ausgedruckt am: 22.11.2024 um 11:11 Uhr
6 Kommentare
Neuester Kommentar
Servus,
WMI ist hier dein Freund
VBA
VBS
Grüße Uwe
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
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")
Servus nochmal.
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 .
Daran denken das der Account der das Skript ausführt über ausreichend Rechte dazu hat den Dienst zu Starten und zu Stoppen!
Beispiel (VBA)
Grüße Uwe
Kann ich einen Dienst mit VB stoppen und wieder starten?
NatürlichDu 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 .
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
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.
Beispiel liefere ich diesmal nicht weil du ja sowieso
gleich wieder mit was neuem kommst, die Zeit erspar ich mir hier.