Introdução a aplicativos do Serviço Windows

Aviso

Esta documentação não é para a versão mais recente do Serviço do Windows. Para obter o conteúdo mais recente nos Serviços do Windows usando BackgroundService e o modelo do Serviço de Trabalho, confira:

Os serviços do Microsoft Windows, anteriormente conhecidos como serviços do NT, permitem que você crie aplicativos executáveis de longa execução que são executados em suas próprias sessões do Windows. Esses serviços podem ser iniciados automaticamente quando o computador é inicializado, podem ser colocados em pausa e reiniciados e não exibem nenhuma interface do usuário. Esses recursos fazem com que os serviços sejam ideais para serem usados em um servidor ou sempre que você precisar de uma funcionalidade de longa execução que não interfira em outros usuários que trabalham no mesmo computador. Você também pode executar serviços no contexto de segurança de uma conta de usuário específica diferente do usuário conectado ou da conta padrão do computador. Para obter mais informações sobre serviços e sessões do Windows, confira a documentação do SDK do Windows.

Você pode criar serviços facilmente, criando um aplicativo que é instalado como um serviço. Por exemplo, considere que você queira monitorar dados do contador de desempenho e reagir a valores de limite. Você pode escrever um aplicativo de Serviço Windows que escute os dados do contador de desempenho, implante o aplicativo e comece a coleta e a análise de dados.

Você cria o serviço como um projeto do Microsoft Visual Studio, definindo um código que controla os comandos que podem ser enviados ao serviço e quais ações devem ser tomadas quando esses comandos são recebidos. Os comandos que podem ser enviados a um serviço incluem iniciar, pausar, retomar e parar o serviço. Você também pode executar comandos personalizados.

Depois de criar e compilar o aplicativo, você pode instalá-lo executando o utilitário de linha de comando InstallUtil.exe e passando o caminho para o arquivo executável do serviço. Você pode usar o Gerenciador de Controle de Serviços para iniciar, parar, pausar, retomar e configurar o serviço. Você também pode realizar muitas das mesmas tarefas no nó Serviços no Gerenciador de Servidores ou usando a classe ServiceController.

Aplicativos de Serviço versus outros aplicativos do Visual Studio

Os aplicativos de serviço funcionam de forma diferente de vários outros tipos de projeto por vários motivos:

  • O arquivo executável compilado que um projeto de aplicativo de serviço cria precisa ser instalado no servidor antes que o projeto possa funcionar de forma significativa. Você não pode depurar ou executar um aplicativo de serviço pressionando F5 ou F11. Você não pode executar um serviço ou intervir no código imediatamente. Nesse caso, você precisa instalar e iniciar o serviço e, em seguida, anexar um depurador ao processo do serviço. Para obter mais informações, confira Como depurar aplicativos de Serviço Windows.

  • Ao contrário de alguns tipos de projetos, você precisa criar componentes de instalação para aplicativos de serviço. Os componentes de instalação instalam e registram o serviço no servidor e criam uma entrada para o serviço com o Gerenciador de Controle de Serviços do Windows. Para obter mais informações, confira Como adicionar instaladores no seu aplicativo de serviço.

  • O método Main para o aplicativo de serviço precisa emitir o comando Run para os serviços que o projeto contém. O método Run carrega os serviços no Gerenciador de Controle de Serviços no servidor apropriado. Se você usar o modelo de projeto de Serviços Windows, esse método será escrito automaticamente. Observe carregar um serviço não é a mesma coisa que iniciar o serviço. Confira "Tempo de vida do serviço" abaixo para obter mais informações.

  • Os aplicativos de Serviço Windows são executados em uma estação de janela diferente da estação interativa do usuário conectado. Uma estação de janela é um objeto seguro que contém uma área de transferência, um conjunto de átomos globais e um grupo de objetos de área de trabalho. Como a estação de Serviço Windows não é uma estação interativa, as caixas de diálogo geradas de um aplicativo de Serviço Windows não serão vistas e poderão fazer com que o programa pare de responder. Da mesma forma, as mensagens de erro devem ser registradas no log de eventos do Windows e não geradas na interface do usuário.

    As classes de Serviço Windows com suporte do .NET Framework não permitem a interação com estações interativas, ou seja, com o usuário conectado. O .NET Framework também não inclui classes que representam estações e áreas de trabalho. Se o Serviço Windows precisar interagir com outras estações, será necessário acessar a API do Windows não gerenciada. Para obter mais informações, confira a documentação do SDK do Windows.

    A interação do serviço Windows com o usuário ou com outras estações precisa ser projetada cuidadosamente para incluir cenários como, quando não houver nenhum usuário conectado ou quando o usuário tiver um conjunto inesperado de objetos de área de trabalho. Em alguns casos, pode ser mais apropriado escrever um aplicativo do Windows que seja executado sob o controle do usuário.

  • Os aplicativos de serviço Windows são executados em seus próprios contextos de segurança e são iniciados antes do usuário fazer logon no computador Windows no qual estão instalados. Você deve planejar cuidadosamente em qual conta de usuário o serviço será executado. Um serviço executado na conta do sistema tem mais permissões e privilégios do que em uma conta de usuário.

Tempo de vida do serviço

Um serviço passa por vários estados internos durante seu tempo de vida. Primeiro, o serviço está instalado no sistema no qual será executado. Esse processo executa os instaladores do projeto de serviço e carrega o serviço no Gerenciador de Controle de Serviços desse computador. O Gerenciador de Controle de Serviços é o utilitário central fornecido pelo Windows para administrar serviços.

Depois que o serviço é carregado, ele precisa ser iniciado. Iniciar o serviço permite que ele comece a funcionar. Você pode iniciar um serviço usando o Gerenciador de Controle de Serviços, o Gerenciador de Servidores ou o código chamando o método Start. O método Start passa o processamento para o método OnStart do aplicativo e processa qualquer código que você tenha definido ali.

Um serviço em execução pode existir nesse estado indefinidamente até que ele seja interrompido ou colocado em pausa, ou até que o computador seja desligado. Um serviço pode existir em um de três estados básico: Running, Paused ou Stopped. O serviço também pode relatar o estado de um comando pendente: ContinuePending, PausePending, StartPending ou StopPending. Esses status indicam que um comando foi emitido, como um comando para pausar um serviço em execução, mas ainda não foi executado. Você pode consultar o Status para determinar em qual estado o serviço está ou usar o WaitForStatus para executar uma ação quando algum desses estados ocorrer.

Você pode pausar, parar ou retomar um serviço usando o Gerenciador de Controle de Serviço, do Gerenciador de Servidores ou chamando os métodos no código. Cada uma dessas ações pode chamar um procedimento associado no serviço (OnStop, OnPause ou OnContinue), no qual você pode definir o processamento adicional a ser executado quando o estado do serviço for alterado.

Tipos de serviços

Há dois tipos de serviços que você pode criar no Visual Studio usando o .NET Framework. Os serviços que são o único serviço em um processo recebem o tipo Win32OwnProcess. Os serviços que compartilham um processo com outro serviço recebem o tipo Win32ShareProcess. Você pode recuperar o tipo do serviço consultando a propriedade ServiceType.

Ocasionalmente, você poderá ver outros tipos de serviço ao consultar os serviços existentes que não foram criados no Visual Studio. Para obter mais informações sobre eles, confira o ServiceType.

Serviços e o componente ServiceController

O componente ServiceController é usado para se conectar a um serviço instalado e manipular o seu estado. Usando um componente ServiceController, você pode iniciar e parar um serviço, pausar e continuar seu funcionamento e enviar comandos personalizados a um serviço. No entanto, você não precisa usar um componente ServiceController ao criar um aplicativo de serviço. Na verdade, na maioria dos casos o componente ServiceController deve existir em um aplicativo separado do aplicativo de serviço Windows que define seu serviço.

Para obter mais informações, consulte ServiceController.

Requisitos

  • Os serviços precisam ser criados em um projeto de aplicativo de Serviço Windows ou em outro projeto habilitado pelo .NET Framework que crie um arquivo .exe ao ser compilado e seja herdado da classe ServiceBase.

  • Os projetos que contêm serviços Windows precisam ter os componentes de instalação para o projeto e seus serviços. Isso pode ser conseguido facilmente pela janela Propriedades. Para obter mais informações, confira Como adicionar instaladores no seu aplicativo de serviço.

Confira também