it-swarm.com.de

So prüfen Sie, ob ein Windows-Dienst in C # installiert ist

Ich habe einen Windows-Dienst geschrieben, der einen WCF-Dienst für eine GUI verfügbar macht, die auf demselben Computer installiert ist. Wenn ich beim Ausführen der GUI keine Verbindung zum Dienst herstellen kann, muss ich wissen, ob die Dienstanwendung noch nicht installiert ist oder ob der Dienst nicht ausgeführt wird. Wenn ersteres, werde ich es installieren (wie beschrieben hier ); Wenn letzteres, möchte ich es starten.

Die Frage ist: Wie können Sie feststellen, ob der Dienst installiert ist und dann festgestellt hat, dass er installiert ist. Wie starten Sie ihn?

70
Shaul Behr

Benutzen:

// add a reference to System.ServiceProcess.dll
using System.ServiceProcess;

// ...
ServiceController ctl = ServiceController.GetServices()
    .FirstOrDefault(s => s.ServiceName == "myservice");
if(ctl==null)
    Console.WriteLine("Not installed");
else    
    Console.WriteLine(ctl.Status);
131
Aliostad

Sie könnten auch die folgenden verwenden.

using System.ServiceProcess; 
... 
var serviceExists = ServiceController.GetServices().Any(s => s.ServiceName == serviceName);
35

Eigentlich so:

foreach (ServiceController SC in ServiceController.GetServices())

kann die Ausnahme "Zugriff verweigert" auslösen, wenn das Konto, unter dem Ihre Anwendung ausgeführt wird, keine Rechte zum Anzeigen von Diensteigenschaften hat Andererseits können Sie dies auch sicher durchführen, wenn kein Dienst mit einem solchen Namen vorhanden ist:

ServiceController SC = new ServiceController("AnyServiceName");

Der Zugriff auf seine Eigenschaften, wenn der Dienst nicht vorhanden ist, führt zur InvalidOperationException. Hier ist eine sichere Methode, um zu überprüfen, ob ein Dienst installiert ist:

ServiceController SC = new ServiceController("MyServiceName");
bool ServiceIsInstalled = false;
try
{
    // actually we need to try access ANY of service properties
    // at least once to trigger an exception
    // not neccessarily its name
    string ServiceName = SC.DisplayName;
    ServiceIsInstalled = true;
}
catch (InvalidOperationException) { }
finally
{
    SC.Close();
}
5
Taosique

Für Nichtlinq können Sie das Array wie folgt durchlaufen:

using System.ServiceProcess;

bool serviceExists = false
foreach (ServiceController sc in ServiceController.GetServices())
{
    if (sc.ServiceName == "myServiceName")
    {
         //service is found
         serviceExists = true;
         break;
    }
}
2
ZTAN
 private bool ServiceExists(string serviceName)
    {
        ServiceController[] services = ServiceController.GetServices();
        var service = services.FirstOrDefault(s => string.Equals(s.ServiceName, serviceName, StringComparison.OrdinalIgnoreCase));
        return service != null;
    }
1
Ajaya Nayak

Ich denke, das ist die beste Antwort auf diese Frage. Es ist nicht notwendig, eine zusätzliche Verarbeitung hinzuzufügen, um zu überprüfen, ob der Dienst vorhanden ist, da sonst eine Ausnahme ausgelöst wird. Sie müssen es nur fangen. Sie müssen die Verbindung auch nicht schließen (), wenn Sie die gesamte Methode in using () umschließen.

using (ServiceController sc = new ServiceController(ServiceName))
{
 try
 {
  if (sc.Status != ServiceControllerStatus.Running)
  {
    sc.Start();
    sc.WaitForStatus(ServiceControllerStatus.Running, new TimeSpan(0, 0, 10));
    //service is now Started        
  }      
  else
    //Service was already started
 }
 catch (System.ServiceProcess.TimeoutException)
 {
  //Service was stopped but could not restart (10 second timeout)
 }
 catch (InvalidOperationException)
 {
   //This Service does not exist       
 }     
}
0
bill