Como posso verificar se um Serviço Windows está sendo executado

182

Eu tenho um aplicativo em C # (2.0 em execução no XP incorporado) que está se comunicando com um 'cão de guarda' implementado como um Serviço do Windows. Quando o dispositivo é inicializado, esse serviço normalmente leva algum tempo para iniciar. Gostaria de verificar, no meu código, se o serviço está sendo executado. Como posso fazer isso?

edosoft
fonte
1
Por favor, dê uma olhada no objeto ServiceController no .NET.
Larry
Oooh ... ainda melhor do que rodar o seu próprio via WMI. Vou remover minha resposta.
EBGreen
@EBGreen - Eu não sei, a rota WMI pode ser útil para alguém no futuro, há mais de uma maneira de esfolar um gato, e tudo o que ....
Carl
Sim, mas realmente acho que o ServiceController é melhor do que tudo, então acho que vou deixá-lo excluído. Eu nunca teria sugerido o WMI se não tivesse acabado de acordar. :)
EBGreen

Respostas:

366

Eu acho que algo assim funcionaria:

Adicione System.ServiceProcessàs referências do seu projeto (está na guia .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: também existe um método sc.WaitforStatus()que leva o status desejado e o tempo limite, nunca o usou, mas pode atender às suas necessidades.

Editar: depois de obter o status, para obter o status novamente, você precisará ligar sc.Refresh()primeiro.

Referência: objeto ServiceController no .NET.

Carl
fonte
11
ServiceController.GetServices () recupera uma matriz que contém todo o serviço instalado como objeto ServiceController. Isso pode ajudar bastante.
Larry
9
Adicione referência ao System.ServiceProcess e adicione a instrução: using System.ServiceProcess;
NealWalters
6
Se eu passasse um nome de serviço incorreto, ele parecia travar em vez de gerar um erro. Eu adicionei este código: catch (System.Exception ex) {return "Not found"; }
NealWalters
6
NealWalters: Como você sabe que a exceção foi lançada apenas porque o serviço não foi encontrado? Não existe um tipo de exceção mais adequado para captura?
Patrik Svensson
3
bool estático privado ServiceExists (string serviceName) {return ServiceController.GetServices (). FirstOrDefault (s => s.ServiceName == serviceName)! = null; }
Dmitry Pavlov
16

Aqui você obtém todos os serviços disponíveis e seu status na máquina local.

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

Você pode comparar seu serviço com a propriedade service.name dentro do loop e obter o status do seu serviço. Para obter detalhes, consulte o http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicecontroller.aspx também http://msdn.microsoft.com/en-us/library/microsoft.windows.design .servicemanager (v = vs.90) .aspx

rhatwar007
fonte