procesos obtener ejecucion c# windows-services watchdog

c# - obtener - ¿Cómo puedo verificar si un servicio de Windows se está ejecutando?



obtener procesos en ejecucion c# (3)

Aquí obtiene todos los servicios disponibles y su estado en su máquina local.

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

Puede comparar su servicio con la propiedad service.name dentro del ciclo y obtendrá el estado de su servicio. Para obtener más detalles, vaya a http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicecontroller.aspx también http://msdn.microsoft.com/en-us/library/microsoft.windows.design.servicemanager(v=vs.90).aspx

Tengo una aplicación en C # (2.0 ejecutándose en XP incrustado) que se está comunicando con un ''perro guardián'' que se implementa como un servicio de Windows. Cuando se inicia el dispositivo, este servicio normalmente tarda un poco en comenzar. Me gustaría verificar, desde mi código, si el servicio se está ejecutando. ¿Cómo puedo lograr esto?


Creo que algo como esto funcionaría:

Agregue System.ServiceProcess a las referencias de su proyecto (está en la pestaña .NET).

La manera rápida:

return new ServiceController( SERVICE_NAME ).Status == ServiceControllerStatus.Running;

La manera más segura:

try { using( ServiceController sc = new ServiceController( SERVICE_NAME ) ) { return sc.Status == ServiceControllerStatus.Running; } } catch( ArgumentException ) { return false; } catch( Win32Exception ) { return false; }

La manera verbosa:

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"; } }

Editar: También hay un método sc.WaitforStatus() que toma el estado deseado y el tiempo de espera, nunca lo usó, pero puede adaptarse a sus necesidades.

Editar: una vez que obtenga el estado, para obtener el estado nuevamente deberá llamar a sc.Refresh() primero.

Referencia: objeto ServiceController en .NET.