VB 2005 - Criando um Serviço do Windows (Windows Service)


Um serviço do Windows é uma aplicação que inicia quando o Windows é carregado e roda em segundo plano enquanto o Windows estiver em execução. Para quem conhece o Unix este conceito é similar a um daemon(um programa de computador que roda em segundo plano sendo iniciado como um processo) deste sistema operacional.

Uma aplicação do tipo serviço do Windows é útil quando você deseja monitorar de forma constante alguns arquivos, o teclado, criar um arquivo de log, ou efetuar qualquer tarefa em segundo plano enquanto o sistema esta ocupando efetuando o seu trabalho.

Você pode acessar o gerenciador de serviços do Windows XP clicando no menu iniciar, painel de controle, desempenho e manutenção, ferramentas administrativas e serviços, ou simplesmente clicando em iniciar, executar e digitando services.msc como mostrado na figura abaixo.

A janela de serviços do Windows exibe a relação dos serviços instalados com nome, descrição , Status, Tipo de inicialização, etc.

Nota: Os Windows services não estão disponíveis no Windows 95, 98 ou ME, você precisas ter o Windows NT, Windows 2000 ou Windows XP para rodar serviços.

Este artigo vai mostrar como você pode criar um serviço do Windows usando o Visual Studio 2005. Para ajudá-lo a iniciar o seu trabalho com os serviços do Windows o VS 2005 fornece um projeto do tipo Windows Service o qual possui um modelo de código que você pode usar para criar rapidamente um serviço do Windows. (O Visual Basic 2005 Express Edition não possui este tipo de projeto)

Neste artigo irei criar um serviço bem simples que irá apenas gravar os eventos de vários serviços em um arquivo chamado demoWSEventos.log no diretório raiz do sistema. Neste arquivo iremos registrar uma mensagem indicando o início e o fim do serviço :

Serviço iniciado em 11/12/2005 08:41:20 PM     e      Serviço encerrado em  11/12/2006 10:45:25 PM

Criando um Windows Service no Visual Studio 2005

- Abra o VS 2005 e selecione File -> New Project. O VS irá exibir a janela New Project;

- Na janela New Project selecione o Template Windows Service e informe o nome do projeto como sendo demoWS;

O VS irá apresentar uma janela no modo Design conforme abaixo para o serviço que iremos criar;

Clique no link - click here to switch to code view - para exibir o código fonte do serviço:

Neste momento devemos refletir sobre o que desejamos que o nosso serviço faça: ele deverá gravar em um arquivo no diretório raiz os eventos dos serviços.

Para poder efetuar a gravação em arquivo teremos que usar o namespace System.IO no nosso projeto. Declare então o seguinte comando:

Imports System.IO

Vamos declarar também a variável arquivoWS como sendo do tipo StreamWriter :

Private arquivoWS As StreamWriter

Deveremos colocar o código que inicia o nosso serviço no evento OnStart, desta forma inclua o seguinte código neste evento:

Protected Overrides Sub OnStart(ByVal args() As String)

  ' Add code here to start your service. This method should set things

   ' in motion so your service can do its work.

  Try

      arquivoWS = New StreamWriter("c:\demoWSEventos.log", True)

      arquivoWS.WriteLine("Serviço iniciado em " & DateTime.Now)

      arquivoWS.Flush()

  Catch ex As Exception

      'não vamos tratar exceção

   End Try

End Sub

Como você pode observar a instrução abre o arquivo e então usando a classe o método Writeline da classe StreamWriter escreve uma mensagem com a hora atual no arquivo. Não vamos fechar o arquivo para torná-lo acessível a outros eventos.

Quando o serviço for encerrado teremos que gravar no arquivo a mensagem de encerramento e aproveitar para fechar o arquivo. O evento apropriado para colocar o código que faz este serviço é o método OnStop(). Inclua neste evento o seguinte código:

Protected Overrides Sub OnStop()

   ' Add code here to perform any tear-down necessary to stop your service.

    Try

     arquivoWS.WriteLine("Serviço encerrado em " & DateTime.Now)

     arquivoWS.Close()

   Catch ex As Exception

     'não vamos tratar exceção

     End Try

End Sub

Agora basta compilar a aplicação usando a opção Build.

Nossa aplicação esta pronta, mas existem algumas coisas que precisamos fazer antes de continuar. O arquivo executável criado não é uma aplicação Windows, e não basta apenas clicar sobre ele para rodar o programa; ele precisa ser instalado como um serviço. Esta será a nossa próxima etapa e iremos usar as facilidades que o VS 2005  nos oferece para poder incluir um instalador para o nosso programa e então usar este utilitário para instalar o serviço.

Antes de você poder instalar um serviço, você precisa incluir um "código instalador" especial no seu projeto. O instalador fornece a informação que o Windows necessita para instalar o serviço com sucesso. Para incluir o código do instalador no nosso projeto demoWS vamos efetuar as seguintes etapas:

           

   

Quando o Windows instala um serviço, ele realiza a instalação usando um dado contexto que define os privilégios que o serviço pode usar. Usando o instalador de processo de serviço que o VS 2005 incluiu no nosso projeto você precisa definir uma conta no sistema (como uma conta de usuário) que define o contexto do serviço.

Para iniciar , você precisa primeiro selecionar o tipo de conta (veja a tabela 1.0) dentre os tipos de contas disponíveis. Os valores possíveis são:

Tipo de Conta Propósito
Local Service Direciona o Windows para rodar o serviço no contexto de uma conta no sistema local que pode ter privilégios extendidos;
NetWork Service Direciona o Windows para rodar o serviço no contexto de uma conta sem-privilégios no sistema local. O serviço apresentará as credenciais a um servidor remoto;
Local System Direciona o WIndows para rodar o serviço no contexto de uma conta sem privilégios no sistema local. O serviço apresentará credenciais anônimas para o servidor remoto
User Direciona o WIndows solicita ao usuário um nome e senha válidos a cada momento que o serviço rodar.

Para  o nosso exemplo vamos definir o tipo de conta como LocalSystem.

Selecione ServiceInstaller1 e altere na janela de propriedades as propriedades DisplayName e ServiceName para exibir o nome demoWS para o nosso serviço;

Nota: O valor padrão da propriedade StarType  é Manual e vamos deixá-la assim para poder mostrar como iniciar o serviço.

Para definir a informação para o instalador do serviço, clique com o botão sobre o ServiceProcessInstaller1 e selecione a opção Properties; Na janela de propriedades do installer defina o tipo de conta como LocalSystem;

Para instalar o service vamos usar o programa InstallUtil, que é um utilitário .NET para instalar serviços do Windows.  Abra uma janela do prompt do DOS e digite a seguinte linha de comando: installUtil c:\demoWS\bin\Release\demoWS.exe

onde : installUtil é o utilitário da plataforma .NET e  c:\demoWS\bin\Release\demoWS.exe é o nosso assembly gerado pela opção Build demoWS do menu Build. Na figura abaixo temos o resultado da execução onde vemos que o serviço foi instalado com sucesso.

Podemos conferir o resultado abrindo a janela de serviços do Windows e localizando o serviço demoWS. Para iniciar o serviço clique com o botão direito do mouse sobre o nome do mesmo e selecione Iniciar:

Se formos olhar na raiz do diretório C:\ iremos encontrar o arquivo demoWSEventos.txt criado pelo serviço quando da sua inicialização:

O procedimento para desinstalar o serviço usa o mesmo utilitário que a instalação : o InstallUtil.exe usando o parâmetro /U; o comando para desinstalar o nosso serviço seria:

InstallUtil /U "C:\demoWS\demoWS\bin\Release\demoWS.exe"

Esteja atento para as seguintes dicas antes de desinstalar um serviço:

Até o próximo artigo VB.NET ...

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti