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?


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.


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.