Compartilhar via


Virtualização flexível

Visão geral

O recurso de virtualização flexível possibilita ao aplicativo declarar que algum conjunto de seus arquivos e entradas do Registro deve estar visível para outros aplicativos, e que eles devem persistir no momento da desinstalação do aplicativo. Todos os outros arquivos e entradas de registro não são visíveis para outros aplicativos, e são removidos na desinstalação.

Como controlar a virtualização de locais selecionados

Observação

O comportamento descrito nesta seção foi introduzido no Windows 10, versão 21H1.

Começando no Windows 10, versão 21H1, o sistema mantém o comportamento existente da funcionalidade restrita unvirtualizedResources e as propriedades RegistryWriteVirtualization e FilesystemWriteVirtualization. Além disso, o sistema adiciona a capacidade de o aplicativo declarar pastas específicas e/ou chaves do Registro que você deseja que não sejam virtualizadas.

  • Você pode declarar somente locais do sistema de arquivos dentro de %USERPROFILE%\AppData.
  • Você pode declarar somente locais do Registro dentro do HKCU.

Este é um exemplo.

<!-- Declare the desktop6 and/or virtualization XML namespace where the virtualization properties are defined, and include this in the list of ignorable namespaces. -->
<!-- Declare the XML namespace for the required restricted capability, and include it in the list of ignorable namespaces. -->
<Package
  xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
  xmlns:desktop6="http://schemas.microsoft.com/appx/manifest/desktop/windows10/6"
  xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
  xmlns:virtualization="http://schemas.microsoft.com/appx/manifest/virtualization/windows10"
  IgnorableNamespaces="rescap desktop6 virtualization">

  <!-- ... -->
  <!-- Other entries omitted for brevity. -->
  <!-- ... -->

  <Properties>
    <!-- If you don't want virtualization of registry writes to HKEY_CURRENT_USER, then include the property, and set it to disabled. -->
    <desktop6:RegistryWriteVirtualization>disabled</desktop6:RegistryWriteVirtualization>

    <!-- If you don't want virtualization of file system writes to the user's AppData folder, then include the property, and set it to disabled. -->
    <desktop6:FileSystemWriteVirtualization>disabled</desktop6:FileSystemWriteVirtualization>
    
    <!-- On Windows 10, version 21H1 and later OS versions, you can declare specific file system and/or registry locations that you want to be unvirtualized. 
    If these are recognized on the current device, then they take precedence over the old declarations. On older devices,
    the new declarations are ignored and the old ones are honored. -->
    <virtualization:FileSystemWriteVirtualization>
      <virtualization:ExcludedDirectories>
        <virtualization:ExcludedDirectory>$(KnownFolder:LocalAppData)\Fabrikam\Widgets</virtualization:ExcludedDirectory>
        <virtualization:ExcludedDirectory>$(KnownFolder:RoamingAppData)\Fabrikam\Widgets</virtualization:ExcludedDirectory>
      </virtualization:ExcludedDirectories>
    </virtualization:FileSystemWriteVirtualization>

    <virtualization:RegistryWriteVirtualization>
      <virtualization:ExcludedKeys>
        <virtualization:ExcludedKey>HKEY_CURRENT_USER\Software\Fabrikam\Widgets</virtualization:ExcludedKey>
      </virtualization:ExcludedKeys>
    </virtualization:RegistryWriteVirtualization>
  </Properties>

  <Capabilities>
    <!-- Include the required restricted capability. -->
    <rescap:Capability Name="unvirtualizedResources"/>
  </Capabilities>
</Package>

Observação

Se o aplicativo declarar tanto a sintaxe anterior ao Windows 10, versão 21H1 quanto a sintaxe do Windows 10, versão 21H1, a declaração antiga será usada nas versões anteriores ao Windows 10, versão 21H1, enquanto a nova declaração será usada no Windows 10, versão 21H1 e posteriores.

Mecanismos anteriores ao Windows 10, versão 21H1

Em ambientes tradicionais, os aplicativos podem criar, atualizar e excluir arquivos na maioria dos locais do sistema de arquivos. E eles podem criar, atualizar e excluir entradas no Registro do Windows. Esses arquivos e entradas do Registro ficam visíveis para outros aplicativos no sistema, embora geralmente não precisem ficar. Além disso, quando o aplicativo é desinstalado, esses arquivos e entradas do Registro geralmente são deixados para trás e geram bagunça.

Na UWP (Plataforma Universal do Windows), os arquivos e entradas do Registro são virtualizados para que somente o aplicativo que os grava possa vê-los. E são removidos quando o aplicativo é desinstalado. No entanto, há cenários válidos em que o aplicativo deseja que esses arquivos e entradas do Registro fiquem visíveis para outros aplicativos. Além disso, outros aplicativos podem exigir que esses arquivos e entradas sejam mantidos mesmo depois que o aplicativo que os gravou for desinstalado.

Comportamento padrão do MSIX

Location Contexto Descrição
HKCU Tempo de instalação
  • O aplicativo pode incluir um arquivo user.dat que especifica as entradas de HKCU\Software. Na verdade, essas entradas são gravadas em um arquivo user.dat na pasta AppData do usuário (em uma subpasta para cada aplicativo) e apresentadas ao aplicativo como se as chaves estivessem no HKCU.
  • Para leitura, esse hive privado é mesclado com o HKCU\Software não virtualizado para que todas as entradas pareçam estar no mesmo local.
  • Quando o aplicativo é desinstalado, as entradas virtualizadas não ficam mais disponíveis, porque nunca foram de fato adicionadas ao Registro.
  • As chaves no hive virtualizado ficam visíveis somente para o aplicativo.
HKCU Tempo de execução
  • As gravações vão para um hive privado separado, por aplicativo e por usuário.
  • Para leitura, esse hive é mesclado com o HKCU não virtualizado para que todas as entradas pareçam estar no mesmo local.
  • Quando o aplicativo é desinstalado, as entradas virtualizadas são removidas.
  • As chaves no hive virtualizado ficam visíveis apenas para o aplicativo.
HKLM Tempo de instalação
  • O aplicativo pode incluir um arquivo registry.dat que especifica as entradas de HKLM\Software. Na verdade, essas entradas são gravadas em um arquivo user.dat na pasta AppData do usuário (em uma subpasta para cada aplicativo) e apresentadas ao aplicativo como se as chaves estivessem no HKLM.
  • Para leitura, esse hive privado é mesclado com o HKLM\Software não virtualizado para que todas as entradas pareçam estar no mesmo local.
  • Quando o aplicativo é desinstalado, as entradas virtualizadas não ficam mais disponíveis, porque nunca foram de fato adicionadas ao Registro.
  • As chaves no hive virtualizado ficam visíveis somente para o aplicativo.
HKLM Tempo de execução
  • As gravações em HKLM são permitidas desde que uma chave/valor correspondente não exista no hive do pacote e o usuário tenha as permissões de acesso corretas (o que significa que isso só está disponível para um aplicativo Centennial em execução com elevados).
Pastas conhecidas Tempo de instalação
  • O aplicativo pode incluir uma pasta VFS com subpastas nomeadas conhecidas que contêm arquivos arbitrários.
  • Para leitura, essas subpastas são mescladas aos locais conhecidos não virtualizados, para que todos os arquivos pareçam estar no mesmo local.
AppData Tempo de execução
  • Para versões do Windows anteriores ou iguais à 1809, todas as gravações na pasta AppData do usuário (incluindo criar, excluir e atualizar) são copiadas na gravação para um local privado, por usuário e por aplicativo, que é mesclado em tempo de execução para aparecer no local real do AppData.
  • Para as versões do Windows posteriores à 1809, todos os arquivos e pastas recém-criados na pasta AppData do usuário são gravados em um local privado, por aplicativo e por usuário, que é mesclado em tempo de execução para aparecer no local AppData real. As modificações nos arquivos AppData existentes são feitas nos arquivos não virtualizados. Para leituras, o sistema tenta primeiro o local privado e, depois, volta para o AppData não virtualizado.
  • No fallback, gravações nos arquivos não virtualizados são permitidas.
  • Quando o aplicativo é desinstalado, as entradas virtualizadas são removidas.
  • Os arquivos no local virtualizado são visíveis somente para o aplicativo.
  • Não há suporte de VFS para AppData.
  • Além de AppData, o aplicativo pode gravar em qualquer local em que o usuário tenha acesso de gravação, incluindo outras partes de %userprofile% (das quais AppData é apenas uma parte).

A funcionalidade restrita unvirtualizedResources

Observação

O suporte para a funcionalidade restrita unvirtualizedResources foi introduzido no Windows 10, versão 1903 (10.0; Build 18362), também conhecido como Atualização de maio de 2019 para o Windows 10.

O aplicativo pode declarar a funcionalidade restrita unvirtualizedResources e definir as propriedades RegistryWriteVirtualization e/ou FilesystemWriteVirtualization como true para obter acesso de gravação ao HKCU e/ou ao AppData. A finalidade disso é habilitar o caso em que o aplicativo precisa gravar entradas que são visíveis para outros processos fora de seu pacote. Por exemplo, gravações de jogos salvam dados em AppData e esses dados precisam persistir mesmo depois que o jogo é desinstalado.

Propriedade Descrição
RegistryWriteVirtualization=disabled As gravações no HKCU vão para o local não virtualizado, ficam visíveis para outros processos fora do pacote e não são limpas na desinstalação do aplicativo.
FilesystemWriteVirtualization=disabled As gravações no AppData vão para o local não virtualizado, ficam visíveis para outros processos fora do pacote e não são limpas na desinstalação do aplicativo.

Esse mecanismo desliga a virtualização de HKCU e/ou AppData completamente, o que vai contra a meta principal. Ele não é uma ferramenta granular e geralmente excede os requisitos de um determinado aplicativo.