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

182

Tengo una aplicación en C # (2.0 que se ejecuta en XP incorporado) que se está comunicando con un 'watchdog' que se implementa como un Servicio de Windows. Cuando se inicia el dispositivo, este servicio suele tardar un tiempo en iniciarse. Me gustaría verificar, desde mi código, si el servicio se está ejecutando. ¿Cómo puedo lograr esto?

edosoft
fuente
1
Eche un vistazo al objeto ServiceController en .NET.
Larry
Oooh ... incluso mejor que rodar el tuyo a través de WMI. Eliminaré mi respuesta.
EBGreen
@EBGreen - No sé, la ruta WMI puede ser útil para otra persona en el futuro, hay más de una forma de desollar a un gato, y todo eso ...
Carl
Sí, pero realmente creo que ServiceController es mejor sobre todo, así que creo que lo dejaré eliminado. Nunca hubiera sugerido WMI si no me hubiera despertado. :)
EBGreen

Respuestas:

366

Supongo que algo como esto funcionaría:

Agregue System.ServiceProcessa sus referencias de proyecto (está en la pestaña .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";
}

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

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

Referencia: objeto ServiceController en .NET.

Carl
fuente
11
ServiceController.GetServices () recupera una matriz que contiene todo el servicio instalado como objeto ServiceController. Esto puede ayudar mucho.
Larry
9
Agregue referencia a System.ServiceProcess y agregue la instrucción: using System.ServiceProcess;
NealWalters
66
Si pasé un nombre de servicio incorrecto, parecía bloquearse en lugar de arrojar un error. Agregué este código: catch (System.Exception ex) {return "No encontrado"; }
NealWalters
66
NealWalters: ¿Cómo sabe que se produjo la excepción solo porque no se encontró el servicio? ¿No hay un tipo de excepción más adecuado para atrapar?
Patrik Svensson
3
privado Bool estático ServiceExists (string serviceName) {return ServiceController.GetServices (). FirstOrDefault (s => s.ServiceName == serviceName)! = null; }
Dmitry Pavlov
16

Aquí obtendrá 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 bucle y obtener el estado de su servicio. Para obtener más información, visite http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicecontroller.aspx y también http://msdn.microsoft.com/en-us/library/microsoft.windows.design .servicemanager (v = vs.90) .aspx

rhatwar007
fuente