Jogos com contas de usuário Least-Privileged

Este artigo descreve como os desenvolvedores de jogos podem criar jogos do Microsoft Windows que funcionam bem com contas de usuário com privilégios mínimos (também conhecidas como contas de usuário limitado).

Introdução

O Windows gerencia seus usuários com contas. Hoje, mais de 80% dos usuários de computador em casa compartilham seu computador com outros membros da família. Quando vários usuários compartilham um computador Windows, várias contas de usuário são criadas e cada usuário faz logon com uma conta individual para acessar o computador. Com a conscientização crescente sobre a segurança, mais pessoas operam seus computadores com contas de usuário com privilégios mínimos, também conhecidas como contas de usuário limitado, que não têm controle total sobre o sistema. As contas de administrador normalmente têm acesso irrestrito a todas as partes do computador. Isso pode afetar como os jogos baseados no Windows funcionam.

Há benefícios adicionais para desenvolvedores de jogos que escrevem seus jogos para trabalhar com contas de usuário com privilégios mínimos. No Windows Vista e posterior, as contas de usuário com privilégios mínimos são impostas, o que significa que cada conta no sistema, com exceção do administrador local, é uma conta de usuário com privilégios mínimos. Isso afetará como os jogos que não seguem as diretrizes (aplicativos herdados) são executados no Windows Vista e posterior. Por exemplo, quando um aplicativo tenta gravar em uma pasta ou um valor do Registro no qual não tem permissão, a gravação do arquivo é redirecionada para um repositório de arquivos virtual para o usuário. Esse repositório de arquivos virtual residirá em uma pasta na qual o usuário tem acesso de gravação. Esse comportamento pode não parecer tão catastrófico quanto falhar totalmente na tentativa de gravação; no entanto, aplicativos que criam arquivos virtualizados podem confundir os usuários porque os arquivos não serão gravados no local esperado pelos usuários. Por exemplo, jogos que gravam arquivos de pontuação alta na mesma pasta que a pasta executável gravarão esses arquivos em uma pasta virtualizada. Consequentemente, um usuário não pode ver a pontuação alta obtida por outro usuário porque cada usuário tem um repositório de arquivos virtualizado separado.

Os jogos que seguem as diretrizes neste artigo serão executados com contas de usuário com privilégios mínimos e, consequentemente, manterão a compatibilidade com o Windows Vista e posteriores.

Acesso a arquivos para contas de usuário Least-Privileged

O Windows dá suporte a dois sistemas de arquivos: FAT32 e NTFS. FAT32 é um sistema de arquivos herdado com suporte apenas para compatibilidade com versões anteriores; O NTFS dá suporte a permissões de arquivo mais poderosas e robustas. O uso do NTFS está se expandindo à medida que os varejistas estão enviando novos computadores com o Windows pré-instalado em um disco rígido particionado pelo NTFS. Em um sistema Windows XP baseado em NTFS, os usuários com contas de usuário com privilégios mínimos têm acesso limitado apenas a várias pastas. No entanto, eles teriam acesso completo em um sistema Windows XP baseado em FAT32.

A tabela a seguir lista o local padrão dessas pastas e suas permissões.

Caminho Conteúdo da Pasta Ler Gravar Criar/excluir
<Unidade>:\Windows O sistema operacional Windows X
<Unidade>:\Arquivos de Programas Arquivos de aplicativo executáveis X
<Unidade>:\Documentos e Configurações\Nome de usuário* Arquivos de cada usuário X X X
<Unidade>:\Documentos e Configurações\Todos os Usuários Todos os arquivos de usuário X X X

 

* Nome de usuário é o nome de logon do usuário.

Em uma conta de usuário com privilégios mínimos, você pode ler, gravar, criar e excluir arquivos em qualquer pasta: Documents and Settings\Username ou Documents and Settings\All Users.

O que isso significa é que você não deve colocar salvar jogos em \Arquivos de Programas, em vez disso, eles devem ir em uma subpasta em \Meus Documentos. Além disso, você não deve colocar dados temporários do aplicativo em \Arquivos de Programas ou \Meus Documentos, em vez disso, eles devem ser colocados na pasta Dados do Aplicativo (CSIDL_LOCAL_APPDATA).

Mais especificamente, há dois cenários que cada jogo deve lidar:

Cenário 1: arquivos que não precisam ser exibidos ou alterados pelos usuários

Um exemplo típico seria o arquivo de configuração do jogo, arquivos temporários e arquivos de cache de jogos. Esses arquivos normalmente são mantidos na pasta Dados do Aplicativo. Para obter esse caminho de pasta, chame a função SHGetFolderPath com CSIDL_APPDATA ou CSIDL_LOCAL_APPDATA conforme mostrado no exemplo de código a seguir.

#include <shlobj.h>
#include <strsafe.h>

#define APPNAME L"MyApp"

WCHAR wszPath[MAX_PATH];

// Local Application Data
SHGetFolderPath( hWnd, CSIDL_LOCAL_APPDATA, NULL, SHGFP_TYPE_CURRENT, wszPath );
StringCchCatW( wszPath, MAX_PATH, L"\\" );
StringCchCatW( wszPath, MAX_PATH, APPNAME );

// Create the folder wszPath
// Then create files in wszPath
// Roaming Application Data
SHGetFolderPath( hWnd, CSIDL_APPDATA, NULL, SHGFP_TYPE_CURRENT, wszPath );
StringCchCatW( wszPath, MAX_PATH, L"\\" );
StringCchCatW( wszPath, MAX_PATH, APPNAME );

// Create the folder wszPath
// Then create files in wszPath

A diferença entre pastas locais e móveis de Dados do Aplicativo é que, no Windows 2000 e no Windows XP, o conteúdo móvel é copiado de e para o servidor durante o processo de logon/logoff, enquanto o conteúdo local não é. Para a maioria dos jogos, os Dados do Aplicativo locais são suficientes.

Cenário 2: arquivos que precisam ser exibidos ou alterados pelos usuários

Um exemplo típico seria os arquivos de jogo salvos de um usuário. Armazene os arquivos na pasta de documentos do usuário para que eles fiquem facilmente visíveis para o usuário. Um aplicativo obtém o caminho da pasta do documento do usuário chamando SHGetFolderPath com CSIDL_PERSONAL, como mostra o exemplo de código a seguir:

#include <shlobj.h>
#include <strsafe.h>

#define APPNAME L"MyApp"

WCHAR wszPath[MAX_PATH];

SHGetFolderPath( hWnd, CSIDL_PERSONAL, NULL, SHGFP_TYPE_CURRENT, wszPath );
StringCchCatW( wszPath, MAX_PATH, L"\\" );
StringCchCatW( wszPath, MAX_PATH, APPNAME );

// Create the folder wszPath
// Then create files in wszPath

Às vezes, um jogo pode precisar armazenar arquivos que todos os usuários devem ver e usar. Um exemplo é o registro de pontuação alta, em que todos os usuários gravam no mesmo arquivo de registro para que as pontuações altas sejam mantidas em todo o sistema em vez de uma pontuação alta separada para cada usuário. Outros exemplos são mapas baixados, missões e modificações de jogos. Se eles forem compartilhados, apenas um usuário precisará baixá-los em vez de todos os usuários. Nesse cenário, use a pasta do documento na pasta de perfil compartilhado, conforme demonstrado no código a seguir.

#include <shlobj.h>
#include <strsafe.h>

#define APPNAME L"MyApp"

WCHAR wszPath[MAX_PATH];

SHGetFolderPath( hWnd, CSIDL_COMMON_DOCUMENTS, NULL, SHGFP_TYPE_CURRENT, wszPath );
StringCchCatW( wszPath, MAX_PATH, L"\\" );
StringCchCatW( wszPath, MAX_PATH, APPNAME );

// Create the folder wszPath
// Then create files in wszPath

Acesso ao Registro para contas de usuário do Least-Privileged

É comum que os aplicativos usem o Registro do Windows para armazenar informações. Semelhante ao acesso a arquivos, o administrador e as contas de usuário com privilégios mínimos não têm a mesma permissão para o registro. Para contas de usuário com privilégios mínimos, todo o nó HKEY_LOCAL_MACHINE é somente leitura. Por exemplo, um jogo pode ler as informações de configuração padrão, mas pode não gravar nenhuma informação nova nesse nó. Consequentemente, os jogos em execução no modo de usuário com privilégios mínimos que precisam gravar no registro precisarão usar o nó HKEY_CURRENT_USER para armazenar informações por usuário, conforme ilustrado no código a seguir.

#define APP_REGISTRY_KEY_PATH L"Software\\MyCompany\\MyApp"

LONG lRetVal;
HKEY hKey;

lRetVal = RegCreateKeyExW( HKEY_CURRENT_USER,
                           APP_REGISTRY_KEY_PATH,
                           0,
                           NULL,
                           REG_OPTION_NON_VOLATILE,
                           KEY_WRITE|KEY_READ,
                           NULL,
                           &hKey,
                           NULL );

if( ERROR_SUCCESS == lRetVal )
{
    // Store information in hKey
}

Vale a pena observar que, durante a instalação, as informações do Registro devem ser gravadas em HKEY_LOCAL_MACHINE, não HKEY_CURRENT_USER. Isso ocorre porque a pessoa que executa a instalação geralmente é um administrador e pode não ser a única pessoa a usar o programa. Nessa situação, gravar em HKEY_CURRENT_USER torna as informações indisponíveis para outros usuários. Isso geralmente não é um problema porque as informações gravadas no registro durante a instalação são as configurações e as configurações padrão que se aplicam a todos os usuários do programa.

Ao desinstalar o jogo, é necessário esforço extra para remover todos os valores que o jogo gravou no registro. Como o desinstalador é executado por uma pessoa, geralmente o administrador, simplesmente excluir as informações relevantes em HKEY_LOCAL_MACHINE e HKEY_CURRENT_USER não removerá valores para outros usuários. Uma maneira de remover as informações por usuário no registro é enumerar a raiz do hive do registro HKEY_USERS. Cada subchave em HKEY_USERS corresponde ao hive HKEY_CURRENT_USER para um usuário específico no sistema. Ao enumerar HKEY_USERS e remover as informações específicas do jogo em cada subchave, o desinstalador pode garantir que nenhuma informação seja deixada para trás.

Aplicação de patch com contas de usuário Least-Privileged

A aplicação de patch em um jogo envolve a atualização dos arquivos do jogo. Portanto, geralmente requer acesso de gravação à pasta do programa do jogo. Aplicar patch em um jogo é um processo simples quando é feito por um administrador porque ele tem acesso irrestrito à pasta do programa do jogo. Por outro lado, tradicionalmente tem sido difícil, se não impossível, para um usuário menos privilegiado corrigir jogos devido à restrição de acesso. Agora, o Windows Installer foi aprimorado para tornar possível a aplicação de patch de conta de usuário com privilégios mínimos. Para aproveitar esse recurso, os jogos são incentivados a utilizar o Windows Installer para instalação e aplicação de patch.

A partir do Windows Installer 3.0, os patches de aplicativo podem ser aplicados por usuários menos privilegiados quando determinadas condições são atendidas. Essas condições são:

  • O aplicativo foi instalado usando o Windows Installer 3.0.
  • O aplicativo foi originalmente instalado por computador.
  • O aplicativo é instalado a partir de uma mídia removível, como um CD-ROM ou DVD (disco de vídeo digital).
  • Os patches são assinados digitalmente por um certificado identificado pelo pacote do instalador original (.msi arquivo).
  • Os patches podem ser validados em relação à assinatura digital.
  • O pacote do instalador original não desabilitou a aplicação de patch de conta de usuário com privilégios mínimos.
  • O administrador do sistema não desabilitou a aplicação de patch de conta de usuário com privilégios mínimos por meio da política do sistema.

Normalmente, um usuário menos privilegiado não pode modificar os arquivos de programa de um jogo. No entanto, quando as condições acima são atendidas e a aplicação de patch LUA está habilitada, o Windows Installer pode atualizar os arquivos do jogo para que o usuário obtenha a versão mais recente.

Observação

As informações contidas neste artigo referem-se ao produto de software de pré-lançamento, que pode ser substancialmente modificado antes de seu primeiro lançamento comercial. Assim, as informações podem não descrever ou refletir com precisão o produto de software quando lançado comercialmente pela primeira vez. Este artigo é fornecido apenas para fins informativos e a Microsoft não oferece garantias, expressas ou implícitas, em relação a este artigo ou às informações contidas nele.