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.