1120 Alameda Orquidea, Atibaia, SP,  BRA

contact@driverentry.com.br

Prog2Svc – Serviço sem trabalho

Hoje em dia, por mais contraditório que pareça, fazer um serviço não requer muito trabalho. Alguns cliques com o Wizard do Visual Studio 2005 e pronto, já teremos uma aplicação ATL capaz de fornecer interfaces COM e que seja de fato um serviço do Windows. Neste post vou falar sobre uma pequena ferramenta que estou oferecendo como brinde para aqueles que têm a paciência de ler este Blog.

Na primeira empresa que trabalhei como programador, isso há uns 11 anos atrás, eu era responsável por manter o software de comunicação da rede de coletores de dados da Provectus. No início, um programa MFC era responsável por interagir com o driver que controlava a placa SS140, que era a interface que o PC tinha para fazer parte dessa rede de coletores. Logo que o programa se estabilizou, modificamos este software para torná-lo um serviço do Windows.

Mas o que é um serviço?

Um serviço é um módulo executável, que é registrado para que seja executado no sistema mesmo que ninguém faça logon no Windows. Hoje muitas aplicações e componentes do Windows são implementados como serviços. Um serviço não é apenas um executável comum cadastrado para ter seu início automatizado. Um serviço precisa fornecer uma interface com rotinas de CallBack para o sistema, a fim de responder aos comandos de inicialização, parada e suspensão da execução. Esta interface não é uma interface COM como alguns de vocês devem ter imaginado. Dê uma olhada na função StartServiceCtrlDispatcher para que você tenha uma idéia do tipo de interface que estou me referindo. Esta é apenas uma das funções necessárias para se construir um serviço. Dê uma passeada pela referência para saber os detalhes de como se implementa um serviço na unha. Serviços normalmente são executados em conta de sistema, mas podem opcionalmente utilizar uma conta de usuário pré-definida. Veja mais detalhes sobre serviços no site do MSDN.

De volta aos anos 90, nos surgiu então a necessidade de fazer com que o Supervisor, um dos nossos principais programas na Provectus, trabalhasse como um serviço. O Supervisor era um programa gigante construído em Visual Basic 4.0. Ele era responsável por receber os comandos da rede de coletores, e a partir deles, executar Stored Procedures no SQL Server. O Visual Basic 4.0 ainda não implementava o operador AddressOf, que surgiu somente na versão 5.0. Este operador pode ser utilizado para se obter o ponteiro de funções escritas em VB. Isso possibilitou tais programas registrarem rotinas de CallBack no sistema. Enfim, com este operador, alguns quilos de paciência e uma arma apontada para a sua cabeça, seria possível construir um serviço em Visual Basic. Chegamos a cogitar a possibilidade de reescrever todo o Supervisor em C, para que fosse possível então transformá-lo em um serviço. Mas felizmente alguém teve um surto de sanidade e disse:

“Porque você não faz um serviço vazio que simplesmente chama o Supervisor?”


E não é que funciona mesmo? Esta necessidade de ter um programa qualquer se comportando com um serviço é mais comum do que se imagina, principalmente quando falamos de ambientes corporativos. Assim, logo apareceram ferramentas que tornaram isso possível, mas nada me impede de ter minha própria versão.

O programa Prog2Svc é um serviço que faz exatamente isso. Executando este programa sem qualquer parâmetro, é exibida a mensagem abaixo, que informa quais os possíveis parâmetros a serem utilizados.

Desta forma, para registrar a calculadora do Windows como um serviço, utilizaremos a seguinte linha de comando. Lembre-se que esta é uma operação que requer direito administrativo, sendo assim, no caso do Windows Vista, esta linha de comando deveria ser executada a partir de um Prompt de Comandos que foi iniciado como administrador.

Prog2Svc -add Calculadora c:\Windows\System32\calc.exe

Exibida a mensagem de sucesso, você já poderá visualizar seu serviço através gerenciador do Windows. Para ter acesso ao gerenciador de serviços, digite “services.msc” sem as aspas na janela Run… do Windows.

Você pode iniciar seu serviço tanto utilizando gerenciador como utilizando o bom e velho comando “net start Calculadora” na janela Run….

Quando iniciamos o serviço, não temos nenhum sinal de que ele esteja realmente funcionando. Isso porque o calc.exe foi executado em outro Desktop, mas podemos confirmar a sua execução utilizando o Process Explorer.

O parâmetro adicional -interactive pode fazer com que seu novo serviço tenha interação com o Desktop. Nota: O Windows Vista merece uma atenção especial neste ponto. O parâmetro -auto configura o início automático do serviço quando o sistema é ligado. E por último, o parâmetro -silent, que faz com que a instalação seja feita de forma silenciosa, ou seja, nenhuma mensagem de sucesso ou erro será exibida. Nota: Neste caso, o sucesso ou a falha pode ser verificada pelo código de saída do Prog2Svc. Outra possibilidade é o uso de variáveis de ambiente no path da aplicação que será executada. Veja este outro exemplo mais completo.

Prog2Svc -add -silent -auto BlocoDeNotas %SystemRoot%\System32\notepad.exe

Para remover o serviço é muito simples. Veja o exemplo abaixo. Note que para remover serviços, também podemos contar com o modo silencioso.

Prog2Svc -remove Calculadora
Prog2Svc -remove -silent BlocoDeNotas

Como o pseudo serviço termina?

Quando solicitamos a parada do serviço, o programa Prog2Svc recebe uma notificação via uma rotina de CallBack. Neste momento, poderíamos dar uma voadora no peito do processo, mas como isso não é de bom tom, uma rotina identifica a janela principal do processo que foi criado, e envia uma mensagem de WM_CLOSE para esta janela. Depois disso, são aguardados 30 segundos para que o processo tenha a oportunidade de finalizar suas tarefas e desalocar recursos do sistema. Caso este tempo expire e o processo ainda esteja rodando, bem, é como meu amigo Thiago sempre diz: “Só a violência constrói”, e o processo é derrubado via TerminateProcess.

Se você ainda não conseguiu imaginar como essa ferramenta lhe poderia ser útil, pense que você poderia criar um serviço que execute o Command Prompt, e assim, ter uma janela de comandos rodando em conta de sistema. Isso ajudaria a fazer testes e descobrir o que é possível fazer com privilégio desta conta.

Prog2Svc -add -interactive SysCmd %SystemRoot%\System32\cmd.exe

Para instalar este programa basta colocar uma cópia deste executável do diretório System32. Tecnicamente, seria possível colocá-lo em qualquer diretório, mas lembre-se de que a pasta onde ele ficará deveria ser acessível por uma conta de sistema. Assim, não o coloque em pastas como “Meus Documentos” ou outra pasta pessoal.

Como sabemos que a internet não é o lugar mais seguro de se obter um executável, certifique-se de que o programa que você está baixando possui uma assinatura válida.

Have fun!

  • Versão: 1.0.1.0
  • Windows: 2000 XP 2003 Vista

Prog2Svc.exe – x86 (58.7 KB)
Prog2Svc.exe – x64 (59.2 KB)
Prog2Svc.exe – IA64 (113 KB)

27 Responses

  1. legal 🙂

    como eu fasso para “registrar” um programa com um publisher, assim como voce fez com driverentry?

    1. Olá,

      Na verdade não é tão simples, pelo menos não foi pra mim. É necessário comprar um certificado reconhecido pela Microsoft para fazer o Code Signing. Tem uma lista de empresas que fazem isso aqui. A mais barata que encontrei foi a Global Sign que é uma empresa que fica na Bélgica.

      Algumas burocracias são exigidas para que eles tenham certeza de que você é você mesmo. Isso inclui mandar um fax assinado por você (é, com caneta mesmo) direto pra eles, com uma cópia do seu RG ou do seu passaporte.

      Com o certificado em mãos você utiliza as ferramentas do SDK/DDK para assinar seus binários.

      Dê uma olhada no site, e fique a vontade caso tenha alguma dúvida.

      []s,

  2. Olá,
    Tenho interesse neste assunto e você citou “Assim, logo apareceram ferramentas que tornaram isso possível”, tem algum outro programa ou material que você pode me indicar para mais estudos?

    1. Olá,

      Uma das ferramentas que conheço e que faz basicamente a mesma coisa que o Prog2Svc faz é o SrvAny, que vem no Resource Kit do Windows. O Resource Kit pode ser obtido daqui.
      Este link exemplifica como criar serviços a partir de aplicativos comuns utilizando o SrvAny.
      O Resource Kit ainda tem muita coisa interessante, e o site da Sysinternals também oferece uma valiosa lista de ferrentas.

      []s.

  3. cara, eu n consegui faze isso ai eu soh queria esconder o icone do bittorrent como eu faço

  4. Cara obrigado pelo post, muito bom, exatamente o que eu precisava.

    Valew !!!!

  5. Meus parabens, como vc tb comeceia a programar muito cedo, (TK85,MSX, …) belo programa

  6. Eu particularmente acho o SysTrayX bem mais eficiente. Esse fim, além de ocultar qualquer ícone desejado do Tray, é possível também ocultar ele mesmo.
    O programa roda como serviço e para acessá-lo, somente mediante a uma senha mestre definida pelo administrador, ou seja, bem seguro.

  7. Ue eu não consegi faze no Windows XP.
    Coloko bem assim:
    Prog2Svc -add DreamuleSVC C:\Arquivos de programas\DreaMule\emule.exe

    e dizno prompt, não é reconhecido como um comando interno ou externo, bla bla bla

    e no executar diz q o Windows não consegi encontrar o Prog2Svc.

  8. garoto..atenção no que vocee esta fazendo…

    esse programa ñ é pra instalar….

    coloca no C:\ e executa pelo prompt
    comandos:
    {
    cd\
    Prog2Svc -add Calculadora c:\Windows\System32\calc.exe
    }

    ou coloca na pasta system32 e vai dar até pra usar no menu exectar…

    créu..créu…créu…tenha atenção

    ass: Sr. Camundongo-POA-RS

  9. nao é pra instala o softwere… so chama ele onde ele estiver e dá os parametros….

    eita burro!!!!

    ass: SR Camundongo-POA-RS

  10. kara eu consigo colocar ele aparece na lista do SERVICES.MSC so que nao ta iniciando e quando eu coloco para iniciar ele da esse erro:

    O Windows não pode inicar o serviço ” Nome do programa ” em computador local.

    Erro 2: O sistema não pode encontrar o arquivo especificado.

    a calculadora e o notepad do exemplo ai inicia normalmente funfa, mais quando eu coloco um programa do jeito q esta no exemplo ele ta dando esse erro alguma dica para ajuda.

    1. Olá Josimar,

      Acho que o problema que você deve estar tendo seja por causa de paths de programa com espaço. Ex: “C:\Program Files\Meus programas\Teste.exe”.

      Ou mesmo por paths que incluam parâmetros. Ex: “C:\Temp\MeuApp.exe -parametro”.

      Nestes casos você precisa colocar o path do programa a ser chamado entre aspas, para que o Prog2Svc entenda isso como parte de um único parâmetro.

      Você pode consertar isso editando o registro onde o path do programa a ser chamado é gravado em HKLM\SYSTEM\CurrentControlSet\. Nesta chave existe o valor “ImageToExecute” onde deve ser mandito o path do processo a ser chamado.

      Atenciosamente,
      Fernando.

  11. Estou tentando criar um serviço no windows 7 ultimate 64 e está me retornando o seguinte erro:

    erro 5 ao tentar instalar o serviço “teste”

    1. Olá Alexandre,

      Isso é porque você deveria rodar este programa a partir de uma janela de console com direitos administrativos, que são necessários para que um serviço seja criado. Para fazer isso, vá até o atalho do Prompt de comando, clique com o botão direito do mouse e selecione “Rodar como Administrador”. Depois disso, você pode seguir com os passos descritos no post.

      Um abraço,
      Fernando.

  12. oi, boa tarde. Já tinha utilizado este programa outras vezes com sucesso, porém fui baixar ele novamente e agora o antivirus avg diz que tem virus, e não aparece o nome da empresa certificadora, o que devo fazer ?

  13. Fala Fernando,

    blz ? Cara navegando aqui no blog, achei esse post interessante mais surgiu uma duvida:
    Como voce faz pro servico interagir com Desktop ? Tem documentacao para isso ?
    O codigo fonte desse programa nao poderia ser public ? :))))

    PS: Acentuacao do teclado off =/

    Vlww cara um abraco

      1. Cara, grande ajuda!! Conseguiii, porem estou com um problema, o meu servico somente inicia se eu uso junto o Svrany que vem junto com ResourceKit. Quando crio com o Srvany, o servico funciona. Se eu crio o servico somente com meu aplicativo, ele nao inicia. Isso tem alguma coisa haver pelo jeito q estou criando o servico ? Ou esta faltando algum parametro ? Achei que era problema por conta de usuario, mais vi no link que voce passou que tem q ser null para ele pegar a conta local.

        Da uma olhada no code :

        [code]
        CreateService(
        schSCManager,
        Pchar(nome),
        Pchar(desc),
        SERVICE_ALL_ACCESS,
        SERVICE_INTERACTIVE_PROCESS or SERVICE_WIN32_OWN_PROCESS,
        SERVICE_AUTO_START,
        SERVICE_ERROR_IGNORE,
        Pchar(dir),
        nil,
        nil,
        nil,
        nil,
        nil
        );
        [/code]

        []’s

      2. Ahh, me esqueci de postar o erro:

        Não foi possível iniciar o serviço updateSystem devido ao seguinte erro:
        O serviço não respondeu à requisição de início ou controle em tempo hábil.

  14. Olá, eu estou usando o seu programinha aqui,mas parece q de vez em quando ele mostra uma mensagem de tempo expirado,como se fosse trial,isso é normal?!?!
    Abraço..

  15. Acabei de verificar aqui,parece q era outro programa!Obrigado Pelo suporte!

  16. Olá mais uma vez Fernando, em alguns computadores que estou usando o Prog2Svc, estão acusando que ele é Trojan,que cria um arquivo no registro,e cria um arquivo .jpeg e fica trocando informações com um computador,isso acontece mesmo?!?

    1. As únicas informações modificadas no registro são as da adição de cada novo registro instalado por ele.
      Essas informações ficam em HKLM\System\CurrentControlSet\Services. Nada de comunicação remota nem arquivos jpeg.

Leave a Reply

Your email address will not be published.