2008-10-07 21 views
150

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 startet, benötigt dieser Dienst normalerweise etwas Zeit zum Starten. Ich möchte anhand meines Codes überprüfen, ob der Dienst ausgeführt wird. Wie kann ich das erreichen?Wie kann ich überprüfen, ob ein Windows-Dienst ausgeführt wird

Antwort

290

Ich denke, so etwas wie dies funktionieren würde:

hinzufügen System.ServiceProcess zu Ihren Projektreferenzen (es ist auf der Registerkarte .NET).

Der schnelle Weg:

return new ServiceController(SERVICE_NAME).Status == ServiceControllerStatus.Running; 

Der sicherere Weg:

try 
{ 
    using(ServiceController sc = new ServiceController(SERVICE_NAME)) 
    { 
     return sc.Status == ServiceControllerStatus.Running; 
    } 
} 
catch(ArgumentException) { return false; } 
catch(Win32Exception) { return false; } 

Die ausführliche Art und Weise:

using System.ServiceProcess; 

// 

ServiceController sc; 
try 
{ 
    sc = new ServiceController(SERVICE_NAME); 
} 
catch(ArgumentException) 
{ 
    return "Invalid service name."; // Note that just because a name is valid does not mean the service exists. 
} 

using(sc) 
{ 
    ServiceControllerStatus status; 
    try 
    { 
     sc.Refresh(); // calling sc.Refresh() is unnecessary on the first use of `Status` but if you keep the ServiceController in-memory then be sure to call this if you're using it periodically. 
     status = sc.Status; 
    } 
    catch(Win32Exception ex) 
    { 
     // A Win32Exception will be raised if the service-name does not exist or the running process has insufficient permissions to query service status. 
     // See Win32 QueryServiceStatus()'s documentation. 
     return "Error: " + ex.Message; 
    } 

    switch(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"; 
    } 
} 

Edit: Es gibt auch ein Verfahren sc.WaitforStatus(), die einen gewünschten Zustand nimmt und eine Zeitüberschreitung, nie benutzt, aber es kann Ihren Bedürfnissen entsprechen.

Edit: Sobald Sie den Status erhalten, müssen Sie zuerst sc.Refresh() aufrufen, um den Status zu erhalten.

Referenz: ServiceController Objekt in .NET.

+9

ServiceController.GetServices() ruft ein Array ab, das den gesamten installierten Dienst als ServiceController-Objekt enthält. Dies kann sehr hilfreich sein. – Larry

+0

Guter Anruf, ich weiß nicht, ob ich das jemals benutzt habe. Auch wenn Sie es nie verwenden, denke ich, dass es für das Debuggen nützlich wäre, wenn nichts anderes – Carl

+8

sc.WaitforStatus() genau das ist, was ich brauche. Thx – edosoft

18

Bitte werfen Sie einen Blick auf das Objekt ServiceController in .NET.

+2

Oooh ... sogar besser als rollen Ihre eigenen über WMI. Ich werde meine Antwort entfernen. – EBGreen

+3

@EBGreen - Ich weiß nicht, die WMI-Route kann in Zukunft für jemand anderen nützlich sein, es gibt mehr als eine Möglichkeit, eine Katze zu häuten, und all das .... – Carl

+1

Ja, aber ich glaube wirklich, dass ServiceController besser ist über alles, also denke ich, ich werde es gelöscht lassen. Ich hätte niemals WMI vorgeschlagen, wenn ich nicht gerade aufgewacht wäre. :) – EBGreen

9

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

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

Sie können Ihren Service mit service.name Eigenschaft innerhalb Schleife vergleichen und erhalten Sie den Status Ihres Dienstes. Für Details gehen Sie mit der http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicecontroller.aspx auch http://msdn.microsoft.com/en-us/library/microsoft.windows.design.servicemanager(v=vs.90).aspx

Verwandte Themen