2008-10-07 8 views
150

У меня есть приложение в C# (2.0, запущенном на XP), которое связывается с «сторожевым псом», который реализован как служба Windows. Когда устройство загружается, эта служба обычно занимает некоторое время, чтобы начать работу. Я хочу проверить, из моего кода, если служба работает. Как я могу это сделать?Как проверить, работает ли служба Windows

ответ

290

Я думаю, что-то, как это будет работать:

Добавить System.ServiceProcess ваших ссылок проекта (Это на вкладке .NET).

Быстрый способ:

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

Безопаснее путь:

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

многословным путь:

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: Существует также метод sc.WaitforStatus(), который принимает желаемое состояние и тайм-аут, никогда не использовал его, но он может удовлетворить ваши потребности.

Редактировать: Как только вы получите статус, чтобы получить статус снова, вам нужно сначала позвонить sc.Refresh().

Ссылка: ServiceController объект в. NET.

18

Пожалуйста, посмотрите объект ServiceController в .NET.

+2

Oooh ... даже лучше, чем кататься самостоятельно через WMI. Я удалю свой ответ. – EBGreen 2008-10-07 12:12:50

+3

@EBGreen - Я не знаю, маршрут WMI может быть полезен кому-то еще в будущем, есть более чем один способ обмануть кошку, и все это .... – Carl 2008-10-07 12:16:06

9

Здесь вы получаете все доступные услуги и их статус на вашем локальном компьютере.

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

Вы можете сравнить свой сервис с свойством service.name внутри цикла и получить статус своего сервиса. Подробнее см. http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicecontroller.aspx также http://msdn.microsoft.com/en-us/library/microsoft.windows.design.servicemanager(v=vs.90).aspx