Jak mogę sprawdzić, czy usługa Windows jest uruchomiona

182

Mam aplikację w języku C # (2.0 działającą na wbudowanym systemie XP), która komunikuje się z „stróżem” zaimplementowanym jako usługa systemu Windows. Po uruchomieniu urządzenia ta usługa zwykle zajmuje trochę czasu. Chciałbym sprawdzić na podstawie kodu, czy usługa jest uruchomiona. Jak mogę to osiągnąć?

edosoft
źródło
1
Proszę spojrzeć na obiekt ServiceController w .NET.
Larry
Oooh ... nawet lepiej niż tworzenie własnych przez WMI. Usunę moją odpowiedź.
EBGreen,
@EBGreen - Nie wiem, trasa WMI może być przydatna dla kogoś innego w przyszłości, istnieje więcej niż jeden sposób na skórowanie kota i tak dalej ....
Carl
Tak, ale naprawdę uważam, że ServiceController jest lepszy od wszystkich, więc myślę, że zostawię go usuniętego. Nigdy nie zasugerowałbym WMI, gdybym się nie obudził. :)
EBGreen,

Odpowiedzi:

366

Myślę, że coś takiego działałoby:

Dodaj System.ServiceProcessdo referencji do projektu (znajduje się na karcie .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";
}

Edycja: Istnieje również metoda, sc.WaitforStatus()która ma pożądany status i limit czasu, nigdy jej nie użyła, ale może pasować do twoich potrzeb.

Edycja: Po uzyskaniu statusu, aby ponownie uzyskać status, musisz sc.Refresh()najpierw zadzwonić .

Odwołanie: obiekt ServiceController w .NET.

Carl
źródło
11
ServiceController.GetServices () pobiera tablicę zawierającą wszystkie zainstalowane usługi jako obiekt ServiceController. To może bardzo pomóc.
Larry
9
Dodaj odwołanie do System.ServiceProcess i dodaj instrukcję: using System.ServiceProcess;
NealWalters,
6
Jeśli podałem niewłaściwą nazwę usługi, wydawało się, że się zamyka, zamiast zgłaszać błąd. Dodałem ten kod: catch (System.Exception ex) {return "Nie znaleziono"; }
NealWalters,
6
NealWalters: Skąd wiesz, że wyjątek został zgłoszony tylko dlatego, że nie znaleziono usługi? Czy nie ma bardziej odpowiedniego typu wyjątku do złapania?
Patrik Svensson
3
prywatny statyczny bool ServiceExists (ciąg serviceName) {return ServiceController.GetServices (). FirstOrDefault (s => s.ServiceName == serviceName)! = null; }
Dmitry Pavlov
16

Tutaj otrzymujesz wszystkie dostępne usługi i ich status na swoim komputerze lokalnym.

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

Możesz porównać swoją usługę z właściwością service.name wewnątrz pętli i uzyskać status swojej usługi. Aby uzyskać szczegółowe informacje, przejdź do http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicecontroller.aspx także http://msdn.microsoft.com/en-us/library/microsoft.windows.design .servicemanager (v = vs.90) .aspx

rhatwar007
źródło