Come posso verificare se un servizio Windows è in esecuzione


182

Ho un'applicazione in C # (2.0 in esecuzione su XP incorporato) che sta comunicando con un "cane da guardia" che è implementato come un servizio di Windows. All'avvio del dispositivo, questo servizio richiede in genere un po 'di tempo per avviarsi. Vorrei controllare, dal mio codice, se il servizio è in esecuzione. Come posso ottenere questo?


1
Dai un'occhiata all'oggetto ServiceController in .NET.
Larry,

Oooh ... anche meglio che lanciare il tuo tramite WMI. Rimuoverò la mia risposta.
EBGreen

@EBGreen - Non lo so, il percorso WMI potrebbe essere utile per qualcun altro in futuro, c'è più di un modo per scuoiare un gatto e tutto il resto ...
Carl,

Sì, ma penso davvero che ServiceController sia meglio di tutti, quindi penso che lo lascerò eliminato. Non avrei mai suggerito WMI se non mi fossi appena svegliato. :)
EBGreen

Risposte:


366

Immagino che qualcosa del genere funzionerebbe:

Aggiungi System.ServiceProcessai riferimenti del tuo progetto (si trova nella scheda .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";
}

Modifica: esiste anche un metodo sc.WaitforStatus()che richiede uno stato desiderato e un timeout, mai utilizzato ma può soddisfare le tue esigenze.

Modifica: una volta ottenuto lo stato, per ottenere nuovamente lo stato dovrai sc.Refresh()prima chiamare .

Riferimento: oggetto ServiceController in .NET.


11
ServiceController.GetServices () recupera un array che contiene tutto il servizio installato come oggetto ServiceController. Questo può aiutare molto.
Larry,

9
Aggiungi riferimento a System.ServiceProcess e aggiungi l'istruzione: using System.ServiceProcess;
NealWalters,

6
Se ho passato un nome di servizio errato, sembrava bloccarsi invece di generare un errore. Ho aggiunto questo codice: catch (System.Exception ex) {return "Not found"; }
NealWalters il

6
NealWalters: come fai a sapere se l'eccezione è stata generata solo perché il servizio non è stato trovato? Non esiste un tipo di eccezione più adatto da rilevare?
Patrik Svensson,

3
private static bool ServiceExists (string serviceName) {return ServiceController.GetServices (). FirstOrDefault (s => s.ServiceName == serviceName)! = null; }
Dmitry Pavlov il

16

Qui ottieni tutti i servizi disponibili e il loro stato nel tuo computer locale.

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

Puoi confrontare il tuo servizio con la proprietà service.name all'interno del loop e ottenere lo stato del tuo servizio. Per i dettagli, consultare http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicecontroller.aspx anche http://msdn.microsoft.com/en-us/library/microsoft.windows.design .servicemanager (v = VS.90) .aspx

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.