Как я могу проверить, работает ли служба Windows

182

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

edosoft
источник
1
Пожалуйста, посмотрите на объект ServiceController в .NET.
Ларри
Оооо ... даже лучше, чем кататься по WMI. Я удалю свой ответ.
EBGreen,
@EBGreen - я не знаю, маршрут WMI может быть полезен для кого-то еще в будущем, есть больше чем один способ снять шкуру с кошки, и все такое ....
Карл
Да, но я действительно думаю, что ServiceController лучше всех, поэтому я думаю, что оставлю его удаленным. Я бы никогда не предложил WMI, если бы не проснулся. :)
EBGreen

Ответы:

366

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

Добавьте System.ServiceProcessв ваш проект ссылки (это на вкладке .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";
}

Изменить: Существует также метод, sc.WaitforStatus()который принимает желаемый статус и время ожидания, никогда не использовал его, но он может удовлетворить ваши потребности.

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

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

деревенщина
источник
11
ServiceController.GetServices () извлекает массив, содержащий все установленные службы, как объект ServiceController. Это может очень помочь.
Ларри
9
Добавьте ссылку на System.ServiceProcess и добавьте оператор: using System.ServiceProcess;
NealWalters
6
Если я передал плохое имя сервиса, он, казалось, заблокировался вместо того, чтобы выдать ошибку. Я добавил этот код: catch (System.Exception ex) {return "Not found"; }
NealWalters
6
NealWalters: Как вы узнали, что исключение было выдано только потому, что служба не была найдена? Разве нет более подходящего типа исключения для ловли?
Патрик Свенссон
3
private static bool ServiceExists (строка serviceName) {return ServiceController.GetServices (). FirstOrDefault (s => s.ServiceName == serviceName)! = null; }
Дмитрий Павлов
16

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

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

rhatwar007
источник