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ąć?


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.


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.