J'ai une application en C# (2.0 fonctionnant sous XP embarqué) qui communique avec un 'chien de garde' qui est implémenté en tant que service Windows. Lorsque l'appareil démarre, ce service prend généralement un certain temps pour démarrer. Je voudrais vérifier, à partir de mon code, si le service est en cours d'exécution. Comment puis-je accomplir cela?Comment puis-je vérifier si un service Windows est en cours
Répondre
je suppose que quelque chose comme ça fonctionnerait:
Ajouter System.ServiceProcess à vos références de projet (Il est sur l'onglet .NET).
La manière rapide:
return new ServiceController(SERVICE_NAME).Status == ServiceControllerStatus.Running;
La façon plus sûre:
try
{
using(ServiceController sc = new ServiceController(SERVICE_NAME))
{
return sc.Status == ServiceControllerStatus.Running;
}
}
catch(ArgumentException) { return false; }
catch(Win32Exception) { return false; }
La façon verbeux:
using System.ServiceProcess;
//
ServiceController sc;
try
{
sc = new ServiceController(SERVICE_NAME);
}
catch(ArgumentException)
{
return "Invalid service name."; // Note that just because a name is valid does not mean the service exists.
}
using(sc)
{
ServiceControllerStatus status;
try
{
sc.Refresh(); // calling sc.Refresh() is unnecessary on the first use of `Status` but if you keep the ServiceController in-memory then be sure to call this if you're using it periodically.
status = sc.Status;
}
catch(Win32Exception ex)
{
// A Win32Exception will be raised if the service-name does not exist or the running process has insufficient permissions to query service status.
// See Win32 QueryServiceStatus()'s documentation.
return "Error: " + ex.Message;
}
switch(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 y a aussi une méthode sc.WaitforStatus()
qui prend un état souhaité et un timeout, jamais utilisé mais cela peut convenir à vos besoins. Editer: Une fois que vous obtenez le statut, pour obtenir à nouveau le statut, vous devez d'abord appeler le sc.Refresh()
. Référence: ServiceController objet dans .NET.
Veuillez jeter un oeil sur l'objet ServiceController dans .NET.
Oooh ... encore mieux que de rouler les vôtres via WMI. Je vais enlever ma réponse. – EBGreen
@EGGreen - 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 de peau un chat, et tout ça .... – Carl
Ya, mais je pense vraiment que ServiceController est mieux dans l'ensemble, donc je pense que je vais le laisser supprimé. Je n'aurais jamais suggéré WMI si je ne m'étais pas réveillé. :) – EBGreen
Ici, vous obtenez tous les services disponibles et leur statut sur 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 à l'intérieur d'une boucle et vous obtenez l'état de votre service. Pour plus de détails, rendez-vous sur le http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicecontroller.aspx aussi http://msdn.microsoft.com/en-us/library/microsoft.windows.design.servicemanager(v=vs.90).aspx
ServiceController.GetServices() récupère un tableau qui contient tout le service installé en tant qu'objet ServiceController. Cela peut aider beaucoup. – Larry
Bon appel, je ne sais pas si je l'ai déjà utilisé. Même si vous ne l'utilisez jamais, je suppose qu'il serait utile pour le débogage si rien d'autre – Carl
sc.WaitforStatus() était exactement ce dont j'avais besoin. Thx – edosoft