Virtualização do Registro

A virtualização do Registro é uma tecnologia de compatibilidade de aplicativo que permite que operações de gravação do Registro que têm impacto global sejam redirecionadas para locais por usuário. Esse redirecionamento é transparente para aplicativos que leem ou gravam no registro. Ele tem suporte a partir do Windows Vista.

Essa forma de virtualização é uma tecnologia de compatibilidade de aplicativos provisórios; A Microsoft pretende removê-lo de versões futuras do sistema operacional Windows à medida que mais aplicativos forem compatíveis com o Windows Vista e versões posteriores do Windows. Portanto, é importante que seu aplicativo não se torne dependente do comportamento da virtualização do Registro no sistema.

A virtualização destina-se apenas a fornecer compatibilidade para aplicativos existentes. Os aplicativos projetados para o Windows Vista e versões posteriores do Windows não devem gravar em áreas confidenciais do sistema, nem devem depender da virtualização para corrigir quaisquer problemas. Ao atualizar o código existente para ser executado no Windows Vista e em versões posteriores do Windows, os desenvolvedores devem garantir que os aplicativos armazenem dados apenas em locais por usuário ou em locais de computador em %alluserprofile% que usam corretamente uma ACL (lista de controle de acesso).

Para obter mais informações sobre como criar aplicativos compatíveis com UAC, consulte o Guia do Desenvolvedor do UAC.

Visão geral da virtualização

Antes do Windows Vista, os aplicativos eram normalmente executados por administradores. Como resultado, os aplicativos podem acessar livremente arquivos do sistema e chaves do Registro. Se esses aplicativos fossem executados por um usuário padrão, eles falhariam devido a direitos de acesso insuficientes. O Windows Vista e versões posteriores do Windows melhoram a compatibilidade de aplicativos para esses aplicativos redirecionando automaticamente essas operações. Por exemplo, as operações do Registro para o repositório global (HKEY_LOCAL_MACHINE\Software) são redirecionadas para um local por usuário dentro do perfil do usuário conhecido como repositório virtual (HKEY_USERS\<SID> do usuário_Classes\VirtualStore\Machine\Software).

A virtualização do Registro pode ser amplamente classificada nos seguintes tipos:

Abrir Virtualização de Registro

Se o chamador não tiver acesso de gravação a uma chave e tentar abrir a chave, a chave será aberta com o acesso máximo permitido para esse chamador.

Se o sinalizador REG_KEY_DONT_SILENT_FAIL estiver definido para a chave, a operação falhará e a chave não será aberta. Para obter mais informações, confira "Controlando a virtualização do registro" mais adiante neste tópico.

Gravar Virtualização de Registro

Se o chamador não tiver acesso de gravação a uma chave e tentar gravar um valor nela ou criar uma subchave, o valor será gravado no repositório virtual.

Por exemplo, se um usuário limitado tentar gravar um valor na seguinte chave: HKEY_LOCAL_MACHINE\Software\AppKey1, a virtualização redirecionará a operação de gravação para HKEY_USERS\<SID> do usuário_Classes\VirtualStore\Machine\Software\AppKey1.

Ler Virtualização do Registro

Se o chamador ler de uma chave virtualizada, o Registro apresentará uma exibição mesclada dos valores virtualizados (do repositório virtual) e dos valores não virtuais (do repositório global) para o chamador.

Por exemplo, suponha que HKEY_LOCAL_MACHINE\Software\AppKey1 contenha dois valores V1 e V2 e que um usuário limitado grave um valor V3 na chave. Quando o usuário tenta ler valores dessa chave, a exibição mesclada inclui os valores V1 e V2 do repositório global e o valor V3 do repositório virtual.

Observe que os valores virtuais têm precedência sobre valores globais quando presentes. No exemplo acima, mesmo que o repositório global tivesse o valor V3 sob essa chave, o valor V3 ainda seria retornado ao chamador do repositório virtual. Se a V3 fosse excluída do repositório virtual, a V3 seria retornada do repositório global. Em outras palavras, se a V3 fosse excluída de HKEY_USERS\<SID> do usuário_Classes\VirtualStore\Machine\Software\AppKey1 , mas HKEY_LOCAL_MACHINE\Software\AppKey1 tivesse um valor V3, esse valor seria retornado do repositório global.

Escopo da Virtualização do Registro

A virtualização do Registro está habilitada apenas para o seguinte:

  • Processos interativos de 32 bits.
  • Chaves no HKEY_LOCAL_MACHINE\Software.
  • Chaves nas quais um administrador pode gravar. (Se um administrador não puder gravar em uma chave, o aplicativo teria falhado em versões anteriores do Windows, mesmo se fosse executado por um administrador.)

A virtualização do Registro está desabilitada para o seguinte:

  • Processos de 64 bits.

  • Processos que não são interativos, como serviços.

    Observe que usar o Registro como um mecanismo de IPC (comunicação entre processos) entre um serviço (ou qualquer outro processo que não tenha a virtualização habilitada) e um aplicativo não funcionará corretamente se a chave for virtualizada. Por exemplo, se um serviço antivírus atualizar seus arquivos de assinatura com base em um valor definido por um aplicativo, o serviço nunca atualizará seus arquivos de assinatura porque o serviço lê do repositório global, mas o aplicativo grava no repositório virtual.

  • Processos que representam um usuário. Se um processo tentar uma operação ao representar um usuário, essa operação não será virtualizada.

  • Processos no modo kernel, como drivers.

  • Processos que solicitaramExecutionLevel especificados em seus manifestos.

  • Chaves e subchaves de HKEY_LOCAL_MACHINE\Software\Classes, HKEY_LOCAL_MACHINE\Software\Microsoft\Windowse HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT.

Controlando a virtualização do Registro

Além de controlar a virtualização em um nível de aplicativo usando requestedExecutionLevel no manifesto, um administrador pode habilitar ou desabilitar a virtualização por chave para chaves no HKEY_LOCAL_MACHINE\Software. Para fazer isso, use a opção flags do utilitário de linha de comando Reg.exe com os sinalizadores listados na tabela a seguir.

Sinalizador Significado
REG_KEY_DONT_SILENT_FAIL Esse sinalizador desabilita a virtualização aberta do Registro. Se esse sinalizador estiver definido e uma operação aberta falhar em uma chave que tenha a virtualização habilitada, o Registro não tentará reabrir a chave. Se esse sinalizador estiver claro, o Registro tentará reabrir a chave com acesso MAXIMUM_ALLOWED em vez do acesso solicitado.
REG_KEY_DONT_VIRTUALIZE Esse sinalizador desabilita a virtualização do registro de gravação. Se esse sinalizador estiver definido e uma operação criar chave ou definir valor falhar porque o chamador não tem direito de acesso suficiente à chave pai, o registro falhará na operação. Se esse sinalizador estiver claro, o Registro tentará gravar a chave ou o valor no repositório virtual. O chamador deve ter o KEY_READ diretamente na chave pai.
REG_KEY_RECURSE_FLAG Se esse sinalizador for definido, os sinalizadores de virtualização do Registro serão propagados da chave pai. Se esse sinalizador estiver claro, os sinalizadores de virtualização do Registro não serão propagados. Alterar esse sinalizador afeta apenas as novas chaves decrescentes criadas depois que o sinalizador é alterado. Ele não define nem limpa esses sinalizadores para chaves decrescentes existentes.

 

O exemplo a seguir mostra o uso do utilitário de linha de comando Reg.exe com a opção FLAGS para consultar o estado dos sinalizadores de virtualização para uma chave.

C:\>reg flags HKLM\Software\AppKey1 QUERY

HKEY_LOCAL_MACHINE\Software\AppKey1

        REG_KEY_DONT_VIRTUALIZE: CLEAR
        REG_KEY_DONT_SILENT_FAIL: CLEAR
        REG_KEY_RECURSE_FLAG: CLEAR

The operation completed successfully.

Sempre que a auditoria está habilitada em uma chave que está sendo virtualizada, um novo evento de auditoria de virtualização é gerado para indicar que a chave está sendo virtualizada (além dos eventos de auditoria usuais). Os administradores podem usar essas informações para monitorar o status da virtualização em seus sistemas.

Introdução com o Controle de Conta de Usuário

Noções básicas e configuração do controle de conta de usuário

Práticas recomendadas e diretrizes para desenvolvedores de aplicativos em ambientes de privilégios mínimos