Como criar um serviço interaja com a sessões de vários usuários

IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 308403
Sumário
Este artigo descreve como criar um aplicativo de serviço do Windows para interagir com usuários através de uma interface gráfica do usuário (GUI) em um sistema multiusuário.

A arquitetura é descrita neste artigo deve ser usado em serviços que são executados nos seguintes sistemas operacionais:
  • Microsoft Windows NT 4.0 Terminal Server Edition
  • Windows 2000 com os serviços de terminal
  • Microsoft Windows XP com troca rápida de usuário
  • Microsoft Windows Server 2003
Essa arquitetura também funcionará bem para sistemas de único usuário (não-lo servidores).
Mais Informações
A arquitetura geral para um serviço interativo em um sistema multiusuário é descrita na seção a seguir. No entanto, pode ser útil para você para ler primeiro a seção neste artigo intitulado "Noções básicas sobre serviços e o Terminal Server". Essa seção fornece termos e arquiteturais informações referentes a esse design.

Criando um serviço interativo para Terminal Server

Se um serviço que está sendo executado em um sistema multiusuário deve interagir com o usuário conectado, a Microsoft recomenda que o serviço interagir por meio de um aplicativo GUI separado que é executado na sessão do usuário. A Microsoft recomenda que este aplicativo GUI ser projetado para se comunicar com o serviço por meio de algum método de comunicação entre processos, como por meio de um pipe nomeado.

Observação Isso é uma arquitetura cliente/servidor. Você pode configurar o processo de cliente (o aplicativo GUI) para ser executado em cada sessão de usuário como um processo oculto. A maneira mais fácil fazer com que o cliente ser executado em cada sessão é adicionar o processo de cliente para a chave Run na seção HKEY_LOCAL_MACHINE do Registro. Para obter informações adicionais, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
137367Definição das chaves RunOnce no registro
O servidor processar (serviço) e se comunica com o cliente apropriado por alguns meios de comunicação entre processos para informar o cliente quando exibir a interface gráfica do usuário. O cliente, por sua vez, se comunica os resultados da interação do usuário volta para o serviço para que o serviço possa atuar adequadamente.

Porque não haverá vários clientes em execução no sistema (um cliente de separado que executa o em cada sessão de usuário), o serviço deve ter um método bem definido para distinguir os clientes. O método mais comum para distinguir os clientes é nomear o canal de comunicação, usando a identificação da sessão. do cliente

Por exemplo, se o cliente está sendo executado na sessão 4, o cliente pode criar um pipe cujo nome é uma concatenação de um GUID não publicado, seguido por "Channel_4". O cliente irá passar sua identificação de sessão para o serviço (talvez conectando-se ao pipe de outro que é criado pelo serviço) para que o serviço saiba para se conectar ao pipe "Channel_4". O cliente pode obter sua identificação de sessão ligando WTSQuerySessionInformation() com WTSSessionId como a classe de informações.

importante Para obter segurança máxima, o cliente deve especificar FILE_FLAG_FIRST_PIPE_INSTANCE no parâmetro dwOpenMode ao chamar CreateNamedPipe() . Isso protege contra tentativas de aplicativos não autorizados para se conectar a um processo que é executado na conta LocalSystem.

Quando você está criando os aplicativos cliente e serviço, uma consideração final é o compartilhamento de objetos kernel nomeado (por exemplo, eventos, exclusões mútuas, semáforos, objetos de mapeamento de arquivo e outros objetos). Por padrão, um objeto de kernel está acessível somente a sessão onde o objeto foi criado. Isso é chamado de namespace de sessão local . Se o aplicativo cliente e o aplicativo de serviço devem acessar o mesmo objeto de kernel, você deve criar o objeto no namespace global. Para criar um objeto no namespace global, prefixo o nome do objeto com "Global\". Objetos globais estão acessíveis através de serviços de terminal sessões.

Observação Por padrão, pipes são globais. Portanto, o prefixo "Global\" não é necessário no nome do pipe. Para determinar se o prefixo "Global\" é necessário para um objeto, consulte a documentação SDK para o objeto.

Noções básicas sobre serviços e Terminal Server

Um serviço é um aplicativo que pode ser executado mesmo quando nenhum usuário estiver conectado ao sistema. Um serviço geralmente é executado sob uma conta de usuário especial chamada a conta LocalSystem . Aplicativos executados na conta LocalSystem tem privilégios especiais que oferecem uma grande quantidade de energia no computador local. Na maioria das circunstâncias, você não deseja conceder a um usuário para esse tipo de energia (ele pode ser usado para ignorar a segurança do sistema).

Para isolar um serviço de usuário interativo Além disso, o serviço normalmente é executado em uma estação de janela não-interativos. Isso significa que mesmo se o serviço exibir uma GUI, a interface não estará visível para o usuário.

Antes de Terminal Server, se tivesse um serviço exibir uma GUI, o serviço foi instalado como um serviço interativo . Dessa forma, o serviço executado sob a LocalSystem conta na estação de janela interativa. Em um sistema único usuário, uma GUI é exibida por um serviço interativo aparece na área de trabalho do usuário interativo.

Servidores baseados em serviços de terminal usam o conceito de uma sessão de usuário. Quando vários usuários fazer logon servidor com base em serviços de terminal, há várias sessões de usuário. Cada sessão é identificado por uma identificação de sessão exclusiva (começando na sessão 0 e incrementando de um para cada sessão) e cada sessão recebe sua própria estação de janela interativa. Quando um usuário faz logon em um servidor baseado em serviços de terminal, o usuário se conecta a uma sessão existente. Nesse ponto, o sistema cria uma nova sessão para aceitar a próxima conexão. Se um usuário fizer logoff do computador com base em serviços de terminal, a sessão do usuário for destruída (a menos que seja a sessão 0) e a identificação da sessão está disponível para reutilização.

Um usuário pode fazer logon em um servidor do Terminal Services localmente ou remotamente:
  • Para fazer logon localmente, o usuário está fisicamente presente no computador servidor baseado em serviços de terminal e faz logon na sessão de console .
  • Para fazer logon remotamente, o usuário se conecta ao Terminal server com base nos serviços na rede através de um aplicativo de cliente dos serviços de terminal.
No Windows NT 4.0 e no Windows 2000, a sessão de console sempre tem uma identificação de sessão de 0 e sessões remotas sempre tem uma identificação de sessão que é maior do que 0. No Windows XP, no entanto, a sessão de console pode ter qualquer identificação da sessão (incluindo uma identificação de sessão maior que 0). Da mesma forma, as sessões remotas podem ter qualquer identificação da sessão (incluindo a sessão 0).

Quando você cria um serviço, tenha em mente que todos os serviços executados na sessão 0 . Portanto, se um serviço interativo exibe uma GUI, poderá ser visto somente para o usuário que está conectado à sessão 0.

Observação Um serviço não pode interagir diretamente com qualquer sessão, exceto a sessão 0.

Como não há nenhuma maneira para garantir que o usuário interativo é conectado à sessão 0, a Microsoft recomenda que um serviço não seja configurado como um serviço interativo em servidores com serviços de terminal.

Observação O Windows XP introduziu um recurso chamado Troca rápida de usuário (FUS). Esse recurso é uma implementação dos serviços de terminal permite que vários usuários compartilhar um único computador. Quando FUS está ativado, o usuário não precisa fazer logoff antes de outro usuário dinamicamente inicia uma nova sessão de usuário (ou alterna para uma sessão de usuário existente) no mesmo computador. Isso cria a dilema onde não há nenhuma maneira de saber se o usuário interativo atual está conectado a sessão 0. Portanto, a Microsoft recomenda que um serviço que é projetado para Windows XP não seja configurado como um serviço interativo.

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 308403 - Última Revisão: 11/21/2006 15:37:42 - Revisão: 5.3

Interface de Programação de Aplicativos do Microsoft Win32

  • kbmt kbhowto kbkernbase kbservice kbtermserv KB308403 KbMtpt
Comentários