У меня есть приложение в C# (2.0, запущенном на XP), которое связывается с «сторожевым псом», который реализован как служба Windows. Когда устройство загружается, эта служба обычно занимает некоторое время, чтобы начать работу. Я хочу проверить, из моего кода, если служба работает. Как я могу это сделать?Как проверить, работает ли служба Windows
ответ
Я думаю, что-то, как это будет работать:
Добавить 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.
Пожалуйста, посмотрите объект ServiceController в .NET.
Здесь вы получаете все доступные услуги и их статус на вашем локальном компьютере.
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
Oooh ... даже лучше, чем кататься самостоятельно через WMI. Я удалю свой ответ. – EBGreen 2008-10-07 12:12:50
@EBGreen - Я не знаю, маршрут WMI может быть полезен кому-то еще в будущем, есть более чем один способ обмануть кошку, и все это .... – Carl 2008-10-07 12:16:06