ServiceController.ExecuteCommand

Quando criamos Windows Services sob a plataforma .NET, podemos sobrescrever o método OnCustomCommand fornecido pela classe ServiceBase para que, via ServiceController (classe que permite a interceptação da execução do serviço), possamos disparar esse método customizado e, conseqüentemente, executarmos uma determinada tarefa dentro do mesmo.

protected override void OnCustomCommand(int command) { …. }

Com isso, podemos simplesmente em uma aplicação cliente, instanciarmos a classe ServiceController, especificarmos o serviço e a máquina onde ele reside e, finalmente, invocar o método ExecuteCommand, algo como é mostrado no exemplo abaixo:

new ServiceController(“MeuServico”, “.”).ExecuteCommand(N);

Onde o parametro N representa o número inteiro que será passado para o método OnCustomCommand. A questão é que temos um detalhe a ser considerado aqui: se esse valor inteiro for menor que 128, uma exceção do tipo Win32Exception com a seguinte mensagem é atirada: Access denied. Isso ocorre porque provavelmente valores menores que 128 são reservados para o próprio sistema operacional.

Se não me engano, nas versões 1.x do .NET Framework, a exceção atirada era algo como “parametro incorreto”, o que me parece mais significativo para o caso.