Comment puis-je vérifier si un service Windows est en cours d'exécution

182

J'ai une application en C # (2.0 fonctionnant sur XP embarqué) qui communique avec un «chien de garde» implémenté en tant que service Windows. Lorsque l'appareil démarre, ce service prend généralement un certain temps à démarrer. Je voudrais vérifier, à partir de mon code, si le service fonctionne. Comment puis-je accomplir cela?

edosoft
la source
1
Veuillez jeter un œil sur l' objet ServiceController dans .NET.
Larry
Oooh ... encore mieux que de rouler le vôtre via WMI. Je vais supprimer ma réponse.
EBGreen
@EBGreen - Je ne sais pas, la route WMI peut être utile pour quelqu'un d'autre à l'avenir, il y a plus d'une façon d'écorcher un chat, et tout ça ....
Carl
Oui, mais je pense vraiment que ServiceController est meilleur dans l'ensemble, donc je pense que je vais le laisser supprimé. Je n'aurais même jamais suggéré WMI si je ne m'étais pas réveillé. :)
EBGreen

Réponses:

366

Je suppose que quelque chose comme ça fonctionnerait:

Ajoutez System.ServiceProcessà vos références de projet (c'est sur l'onglet .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";
}

Edit: Il existe également une méthode sc.WaitforStatus()qui prend un statut souhaité et un délai d'expiration, jamais utilisé mais cela peut répondre à vos besoins.

Modifier: une fois que vous obtenez le statut, pour obtenir à nouveau le statut, vous devrez appeler sc.Refresh() abord .

Référence: objet ServiceController dans .NET.

Carl
la source
11
ServiceController.GetServices () récupère un tableau qui contient tout le service installé en tant qu'objet ServiceController. Cela peut aider beaucoup.
Larry
9
Ajoutez une référence à System.ServiceProcess et ajoutez l'instruction: using System.ServiceProcess;
NealWalters
6
Si je passais un mauvais nom de service, il semblait se bloquer au lieu de générer une erreur. J'ai ajouté ce code: catch (System.Exception ex) {return "Not found"; }
NealWalters
6
NealWalters: Comment savez-vous que l'exception a été lancée simplement parce que le service n'a pas été trouvé? N'y a-t-il pas un type d'exception plus approprié à attraper?
Patrik Svensson
3
private static bool ServiceExists (string serviceName) {return ServiceController.GetServices (). FirstOrDefault (s => s.ServiceName == serviceName)! = null; }
Dmitry Pavlov
16

Ici, vous obtenez tous les services disponibles et leur état dans votre machine locale.

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

Vous pouvez comparer votre service avec la propriété service.name dans la boucle et vous obtenez le statut de votre service. Pour plus de détails, consultez le http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicecontroller.aspx également http://msdn.microsoft.com/en-us/library/microsoft.windows.design .servicemanager (v = contre 90) .aspx

rhatwar007
la source