Contas de usuário com Comutação Rápida de Usuário e Área de Trabalho Remota

As contas de usuário do Windows XP permitem que vários usuários sejam conectados simultaneamente, cada um com suas próprias configurações e cada um executando seus próprios aplicativos. Como um usuário não precisa fazer logoff para permitir o acesso a outro usuário, a área de trabalho de cada usuário é facilmente acessada usando o recurso de alternância rápida de usuário. As contas de usuário também incluem o recurso Servidor de Terminal Pessoal, ou Área de Trabalho Remota, que permite que os usuários acessem sua conta de área de trabalho de sistemas remotos.

Os tópicos a seguir são discutidos.

Requisitos de uso da infraestrutura

A infraestrutura subjacente herdada do Windows 2000 dá suporte à separação de estado de dados do usuário, configurações do usuário e configurações do computador. Aproveitando essa infraestrutura, o seguinte é necessário para executar seu aplicativo com êxito no Windows XP.

  • Padrão para a pasta Meus Documentos para armazenamento de dados criados pelo usuário.
  • Classifique e armazene os dados do aplicativo corretamente.
  • Degradar normalmente em mensagens "Acesso Negado".

Arquivos temporários, arquivos mapeados em memória e documentos devem ser armazenados no subdiretório apropriado do diretório de perfil do usuário. Use SHGetFolderLocation ou SHGetFolderPath para determinar o local de armazenamento apropriado para esses arquivos. Passar o sinalizador CSIDL_APPDATA para essas funções retorna o caminho de um diretório do sistema de arquivos que serve como um repositório comum para dados específicos do aplicativo. Use o sinalizador CSIDL_LOCAL_APPDATA no lugar de CSIDL_APPDATA para dados que devem ser alterados quando o usuário for alterado, como arquivos temporários.

Os requisitos listados acima são um subconjunto daqueles no programa de Certificação da Microsoft. Para obter mais informações, consulte a página Requisitos de certificação para Aplicativos da Área de Trabalho do Windows.

Compatibilidade com aplicativos existentes

Tanto a alternância rápida de usuário quanto o Servidor de Terminal Pessoal usam a tecnologia dos Serviços de Terminal e, portanto, são compatíveis com a maioria dos aplicativos Anteriores do Microsoft Win32. Se um aplicativo for compatível com o logotipo do Windows 2000, implementando recursos básicos de separação de perfil e gerenciamento de energia, esse aplicativo deverá ser executado corretamente em contas de usuário individuais do Windows XP.

Registrando-se para notificação de alternância de sessão

Normalmente, um aplicativo não precisa ser notificado quando ocorre uma opção de área de trabalho. No entanto, os aplicativos que devem ser notificados quando a conta em que estão em execução é a área de trabalho atual, como aplicativos que acessam a porta serial ou outros recursos compartilhados, podem se registrar para notificação de comutador de área de trabalho. Para se registrar para uma notificação, use a função WTSRegisterSessionNotification.

Depois que essa função tiver sido chamada, a janela com o identificador hWnd será registrada para receber uma mensagem de WM_WTSSESSION_CHANGE por meio de sua função WndProc. A ID da sessão é enviada no parâmetro lParam e um código que indica o evento que gerou a mensagem é enviado no wParam como um dos sinalizadores a seguir.

  • WTS_CONSOLE_CONNECT
  • WTS_CONSOLE_DISCONNECT
  • WTS_REMOTE_CONNECT
  • WTS_REMOTE_DISCONNECT
  • WTS_SESSION_LOGOFF
  • WTS_SESSION_LOGON

Os aplicativos podem usar essa mensagem para acompanhar seu estado, bem como para liberar e adquirir recursos específicos do console. As áreas de trabalho do usuário podem ser alternadas dinamicamente entre controle remoto e de console. Os aplicativos devem usar a mensagem WM_WTSSESSION_CHANGE para sincronizar com o estado de conexão remota ou local.

Quando o processo não exige mais essas notificações ou está sendo encerrado, ele deve chamar WTSUnRegisterSessionNotification para cancelar o registro de sua notificação.

Importante

Os valores hWnd passados para WTSRegisterSessionNotification são contados de referência, portanto, você deve fazer um número igual de chamadas para WTSUnRegisterSessionNotification para garantir a liberação de todos os recursos alocados.

 

Garantindo que apenas uma instância do aplicativo esteja em execução

Muitos aplicativos devem garantir que eles tenham apenas uma instância em execução. Há várias maneiras de fazer isso no Windows XP. Entre eles estão os seguintes:

  • Use FindWindow ou FindWindowEx para pesquisar uma janela conhecida que seu aplicativo abre. Se essa janela já estiver aberta, você poderá usá-la como uma indicação de que o aplicativo já está em execução.
  • Crie um objeto mutex ou semáforo quando seu aplicativo for aberto e feche esse objeto quando o aplicativo for encerrado. O namespace de objeto global é separado para cada área de trabalho, permitindo uma lista exclusiva de objetos mutex e semáforo para cada um.

Desligando seu aplicativo em todas as sessões

Um aplicativo pode precisar se desligar em todas as sessões. Por exemplo, um aplicativo em execução em duas ou mais sessões simultaneamente pode baixar um novo arquivo da Web. Em seguida, talvez seja necessário fechar-se e reiniciar com os bits atualizados. Isso, é claro, precisaria ser feito em todas as sessões em execução. Seu aplicativo deve ser gravado para que ele saia de forma limpa quando uma notificação é recebida.

Interação com os Serviços do Sistema

Do ponto de vista programático, os casos a seguir precisam ser resolvidos.

  • O processo do servidor recebe uma solicitação direta de um processo de cliente.

    Nesse caso, a mensagem provavelmente é transmitida usando uma chamada de procedimento local (LPC) ou uma chamada de procedimento remoto (RPC). Há APIs para LPC ou RPC que permitem a recuperação do token cliente. Depois que o token do cliente for obtido, o servidor poderá usá-lo em uma chamada para CreateProcessAsUser. Isso abre o processo na estação de janela correta, supondo que o token de usuário cliente tenha uma marca de sessão, o que deve ser.

    Observação

    CreateProcessAsUser não dá suporte ao identificador de herança entre sessões no momento.

     

  • O processo do servidor recebe uma notificação e precisa exibir a interface do usuário, mas a exibição não precisa estar no contexto do usuário atual.

    Nesse caso, o processo do servidor pode duplicar seu token de processo primário e alterar o identificador de sessão em questão para corresponder ao identificador de sessão atual. O identificador de sessão atual pode ser obtido usando a função WTSGetActiveConsoleSessionId.

    Observação

    Para definir a ID da sessão de token, você precisa da SE_TCB_PRIVILEGE. Você terá isso apenas como um serviço em execução no NT AUTHORITY\SYSTEM.

     

Área de Trabalho Remota e Largura de Banda

Com a adição do recurso de Área de Trabalho Remota ao Windows XP, os aplicativos devem fazer um esforço para não usar mais largura de banda do que o necessário, evitando desenhos de tela extensos e efeitos de animação se a área de trabalho estiver conectada remotamente. Para determinar se a sessão atual é remota, você pode chamar GetSystemMetrics com SM_REMOTESESSION. No entanto, lembre-se de que essa chamada não distingue entre remoto e desconectado.