Wie kann ich überprüfen, ob ein Windows-Dienst ausgeführt wird?

182

Ich habe eine Anwendung in C # (2.0 läuft unter XP Embedded), die mit einem 'Watchdog' kommuniziert, der als Windows-Dienst implementiert ist. Wenn das Gerät gestartet wird, dauert es normalerweise einige Zeit, bis dieser Dienst gestartet wird. Ich möchte anhand meines Codes überprüfen, ob der Dienst ausgeführt wird. Wie kann ich das erreichen?

edosoft
quelle
1
Bitte schauen Sie sich das ServiceController- Objekt in .NET an.
Larry
Oooh ... noch besser als deine eigenen über WMI zu rollen. Ich werde meine Antwort entfernen.
EBGreen
@EBGreen - Ich weiß nicht, die WMI-Route könnte in Zukunft für jemand anderen nützlich sein, es gibt mehr als einen Weg, eine Katze zu häuten, und all das ...
Carl
Ja, aber ich denke wirklich, dass ServiceController insgesamt besser ist, also denke ich, dass ich es gelöscht lassen werde. Ich hätte WMI niemals vorgeschlagen, wenn ich nicht gerade aufgewacht wäre. :)
EBGreen

Antworten:

366

Ich denke so etwas würde funktionieren:

Fügen Sie System.ServiceProcessIhren Projektreferenzen hinzu (auf der Registerkarte .NET).

using System.ServiceProcess;

ServiceController sc = new ServiceController(SERVICENAME);

switch (sc.Status)
{
    case ServiceControllerStatus.Running:
        return "Running";
    case ServiceControllerStatus.Stopped:
        return "Stopped";
    case ServiceControllerStatus.Paused:
        return "Paused";
    case ServiceControllerStatus.StopPending:
        return "Stopping";
    case ServiceControllerStatus.StartPending:
        return "Starting";
    default:
        return "Status Changing";
}

Bearbeiten: Es gibt auch eine Methode sc.WaitforStatus(), die einen gewünschten Status und eine Zeitüberschreitung annimmt, diese nie verwendet hat, aber möglicherweise Ihren Anforderungen entspricht.

Bearbeiten: Sobald Sie den Status erhalten haben, müssen Sie sc.Refresh()zuerst anrufen, um den Status erneut zu erhalten .

Referenz: ServiceController- Objekt in .NET.

Carl
quelle
11
ServiceController.GetServices () ruft ein Array ab, das den gesamten installierten Dienst als ServiceController-Objekt enthält. Dies kann sehr hilfreich sein.
Larry
9
Fügen Sie einen Verweis auf System.ServiceProcess hinzu und fügen Sie die folgende Anweisung hinzu: using System.ServiceProcess;
NealWalters
6
Wenn ich einen schlechten Dienstnamen übergab, schien er zu blockieren, anstatt einen Fehler auszulösen. Ich habe diesen Code hinzugefügt: catch (System.Exception ex) {return "Not found"; }
NealWalters
6
NealWalters: Woher wissen Sie, dass die Ausnahme ausgelöst wurde, nur weil der Dienst nicht gefunden wurde? Gibt es nicht einen geeigneteren Ausnahmetyp zum Fangen?
Patrik Svensson
3
privater statischer Bool ServiceExists (Zeichenfolge serviceName) {return ServiceController.GetServices (). FirstOrDefault (s => s.ServiceName == serviceName)! = null; }
Dmitry Pavlov
16

Hier erhalten Sie alle verfügbaren Dienste und deren Status auf Ihrem lokalen Computer.

ServiceController[] services = ServiceController.GetServices();
foreach(ServiceController service in services)
{
    Console.WriteLine(service.ServiceName+"=="+ service.Status);
}

Sie können Ihren Dienst mit der Eigenschaft service.name innerhalb der Schleife vergleichen und erhalten den Status Ihres Dienstes. Weitere Informationen finden Sie unter http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicecontroller.aspx sowie unter http://msdn.microsoft.com/en-us/library/microsoft.windows.design .servicemanager (v = vs.90) .aspx

rhatwar007
quelle