Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Normalmente, os serviços são aplicativos de console projetados para serem executados sem supervisão sem uma interface gráfica do usuário (GUI). No entanto, alguns serviços podem exigir interação ocasional com um usuário. Esta página discute as melhores maneiras de interagir com o usuário a partir de um serviço.
Importante
Os serviços não podem interagir diretamente com um usuário a partir do Windows Vista. Portanto, as técnicas mencionadas na seção intitulada Usando um serviço interativo não devem ser usadas em um novo código.
Interagindo indiretamente com um usuário a partir de um serviço
Pode utilizar as seguintes técnicas para interagir com o utilizador a partir de um serviço em todas as versões suportadas do Windows:
Exiba uma caixa de diálogo na sessão do usuário usando a função WTSSendMessage.
Crie um aplicativo GUI oculto separado e use a função CreateProcessAsUser para executar o aplicativo dentro do contexto do usuário interativo. Projete o aplicativo GUI para se comunicar com o serviço através de algum método de comunicação entre processos (IPC), por exemplo, pipes nomeados. O serviço se comunica com o aplicativo GUI para informá-lo quando exibir a GUI. O aplicativo comunica os resultados da interação do usuário de volta ao serviço para que o serviço possa tomar a ação apropriada. Observe que o IPC pode expor suas interfaces de serviço pela rede, a menos que você use uma lista de controle de acesso (ACL) apropriada.
Se esse serviço for executado em um sistema multiusuário, adicione o aplicativo à seguinte chave para que ele seja executado em cada sessão: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run. Se o aplicativo usa pipes nomeados para IPC, o servidor pode distinguir entre vários processos de usuário, dando a cada pipe um nome exclusivo com base no ID da sessão.
A seguinte técnica também está disponível para Windows Server 2003 e Windows XP:
- Exiba uma caixa de mensagem chamando a funçãoMessageBox com MB_SERVICE_NOTIFICATION. Isso é recomendado para exibir mensagens de status simples. Não chame MessageBox durante a inicialização do serviço ou da rotinaHandlerEx, a menos que você o chame de um thread separado, para que você retorne ao SCM em tempo hábil.
Usando um serviço interativo
Por padrão, os serviços usam um de estação de janela de não interativo e não podem interagir com o usuário. No entanto, um de serviço interativo pode exibir uma interface do usuário e receber a entrada do usuário.
Atenção
Os serviços executados em um contexto de segurança elevado, como a conta LocalSystem, não devem criar uma janela na área de trabalho interativa porque qualquer outro aplicativo em execução na área de trabalho interativa pode interagir com essa janela. Isso expõe o serviço a qualquer aplicativo que um usuário conectado execute. Além disso, os serviços que estão sendo executados como LocalSystem não devem acessar a área de trabalho interativa chamando o OpenWindowStation ou função de GetThreadDesktop.
Para criar um serviço interativo, faça o seguinte ao chamar a funçãoCreateService:
- Especifique NULL para o parâmetro lpServiceStartName para executar o serviço no contexto da conta LocalSystem.
- Especifique o sinalizador SERVICE_INTERACTIVE_PROCESS.
Para determinar se um serviço está sendo executado como um serviço interativo, chame a funçãoGetProcessWindowStationpara recuperar um identificador para a estação de janela e a funçãoGetUserObjectInformationpara testar se a estação de janela tem o atributo WSF_VISIBLE.
No entanto, observe que a seguinte chave do Registro contém um valor, NoInteractiveServices, que controla o efeito de SERVICE_INTERACTIVE_PROCESS:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Windows
O valor NoInteractiveServices assume como padrão 1, o que significa que nenhum serviço tem permissão para ser executado interativamente, independentemente de ter SERVICE_INTERACTIVE_PROCESS. Quando NoInteractiveServices é definido como 0, os serviços com SERVICE_INTERACTIVE_PROCESS podem ser executados interativamente.
Windows 7, Windows Server 2008 R2, Windows XP e Windows Server 2003: O valor NoInteractiveServices assume como padrão 0, o que significa que os serviços com SERVICE_INTERACTIVE_PROCESS podem ser executados interativamente. Quando NoInteractiveServices é definido como um valor diferente de zero, nenhum serviço iniciado posteriormente tem permissão para ser executado interativamente, independentemente de ter SERVICE_INTERACTIVE_PROCESS.
Importante
Todos os serviços são executados na sessão 0 dos Serviços de Terminal. Portanto, se um serviço interativo exibe uma interface do usuário, ele fica visível apenas para o usuário que se conectou à sessão 0. Como não há como garantir que o usuário interativo esteja conectado à sessão 0, não configure um serviço para ser executado como um serviço interativo nos Serviços de Terminal ou em um sistema que ofereça suporte à troca rápida de usuário (a troca rápida de usuário é implementada usando os Serviços de Terminal).