Як я можу перевірити, чи працює служба Windows


182

У мене є додаток на C # (2.0 працює на вбудованому XP), який спілкується з "сторожовим собакою", реалізованим як служба Windows. Коли пристрій завантажується, для запуску цієї послуги зазвичай потрібно якийсь час. Я хотів би перевірити з мого коду, чи працює служба. Як я можу це досягти?


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 і додайте оператор: використовуючи System.ServiceProcess;
NealWalters

6
Якщо я передав помилкове ім’я служби, він, здавалося, замикався замість того, щоб кидати помилку. Я додав цей код: catch (System.Exception ex) {return "Не знайдено"; }
NealWalters

6
NealWalters: Як ви знаєте, виняток було кинуто лише тому, що послугу не знайшли? Чи не існує більш підходящого типу винятку для лову?
Патрік Свенссон

3
приватний статичний bool ServiceExists (string 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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.