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 menos privilegiadas (também conhecidas como contas de usuário limitado).

Introduçã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 menos privilegiadas, 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 cada parte do computador. Isso pode afetar como os jogos baseados em Windows funcionam.

Há benefícios adicionais para desenvolvedores de jogos que escrevem seus jogos para trabalhar com contas de usuário menos privilegiadas. Em Windows Vista e posteriores, 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 menos privilegiada. Isso afetará como os jogos que não seguem a diretriz (aplicativos herdados) são executados no Windows Vista e posteriores. 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 de arquivo é redirecionada para um repositório de arquivos virtual para o usuário. Esse repositório de arquivos virtuais residirá em uma pasta à 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, os 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 alta pontuação 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 menos privilegiadas e, consequentemente, manterão a compatibilidade com Windows Vista e posteriores.

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

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 Windows pré-instalados em um disco rígido particionado pelo NTFS. Em um sistema XP Windows baseado em NTFS, os usuários com contas de usuário menos privilegiadas têm acesso limitado a várias pastas. No entanto, eles teriam acesso completo a um sistema XP Windows 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
<Drive>:\Program Files Arquivos de aplicativo executáveis X
<Drive>:\Documents and Configurações\Username* 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: Documentos e Configurações\Nome de usuário ou documentos e Configurações\Todos os usuários.

O que isso significa é que você não deve colocar jogos de salvamento 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 do jogo. Normalmente, esses arquivos 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, em Windows 2000 e 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 sejam facilmente visíveis para o usuário. Um aplicativo obtém o caminho da pasta de documento do usuário chamando SHGetFolderPath com CSIDL_PERSONAL, como mostra o seguinte exemplo de código:

#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 jogo. Se eles forem compartilhados, apenas um usuário precisará baixá-los em vez de cada usuário. 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 Least-Privileged

É comum que os aplicativos usem o registro Windows para armazenar informações. Semelhante ao acesso a arquivos, o administrador e 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 menos privilegiado 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 cada usuário do programa.

Ao desinstalar o jogo, é necessário um 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.

Patching com contas de usuário Least-Privileged

A aplicação de patch de um jogo envolve a atualização dos arquivos do jogo. Portanto, geralmente requer acesso de gravação à pasta do programa do jogo. Corrigir um jogo é um processo simples quando é feito por um administrador porque eles têm 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, Windows Instalador 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 Windows Instalador para instalação e aplicação de patch.

A partir do Windows Instalador 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 Windows Instalador 3.0.
  • O aplicativo foi originalmente instalado por computador.
  • O aplicativo é instalado a partir de 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 na 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 com privilégios mínimos 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, Windows Instalador 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 somente 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.