Virtualización flexible

Información general

La característica de virtualización flexible proporciona una manera de que la aplicación declare que algún conjunto de sus archivos y entradas del Registro debe ser visible para otras aplicaciones y que deben conservarse al desinstalar la aplicación. El resto de archivos y entradas del Registro no son visibles para otras aplicaciones y se quitan al desinstalar.

Control de la virtualización de las ubicaciones seleccionadas

Nota:

El comportamiento descrito en esta sección se introdujo en Windows 10, versión 21H1.

A partir de Windows 10, versión 21H1, el sistema conserva el comportamiento existente de la funcionalidad restringida unvirtualizedResources y las propiedades RegistryWriteVirtualization y FilesystemWriteVirtualization. Además, el sistema agrega la capacidad de que la aplicación declare carpetas o claves del Registro específicas que desea que no se virtualicen.

  • Solo puede declarar ubicaciones del sistema de archivos que se encuentran en %USERPROFILE%\AppData.
  • Solo puede declarar ubicaciones del Registro que se encuentran en HKCU.

Este es un ejemplo.

<!-- 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>

Nota:

Si la aplicación declara la sintaxis anterior a Windows 10 versión 21H1 y la de Windows 10 versión 21H1, la declaración anterior se usará en versiones anteriores a Windows 10 21H1, mientras que la nueva declaración se usará en versiones anteriores a Windows 10 21H1 y posteriores.

Mecanismos anteriores a Windows 10, versión 21H1

En entornos tradicionales, las aplicaciones pueden crear, actualizar y eliminar archivos en la mayoría de los lugares del sistema de archivos. También pueden crear, actualizar y eliminar entradas en el Registro de Windows. Esos archivos y entradas del Registro son visibles para otras aplicaciones del sistema, aunque a menudo no es necesario. Además, cuando se desinstala la aplicación, esos archivos y entradas del Registro a menudo se quedan atrás y quedan desordenados.

En la Plataforma universal de Windows (UWP), estos archivos y entradas del Registro se virtualizan para que solo la aplicación que los escribe pueda verlos. Y se quitan cuando se desinstala la aplicación. Pero hay escenarios válidos en los que la aplicación quiere que estos archivos y entradas del Registro sean visibles para otras aplicaciones. Además, otras aplicaciones pueden requerir que esos archivos y entradas se conserven incluso después de que se desinstale la aplicación que los escribió.

Comportamiento predeterminado de MSIX

Location Context Descripción
HKCU Hora de instalación
  • La aplicación puede incluir un archivo user.dat que especifique las entradas HKCU\Software. En realidad, estas entradas se escriben en un archivo user.dat de la carpeta AppData del usuario (en una carpeta secundaria para cada aplicación) y se presentan a la aplicación como si las claves estuvieran en HKCU.
  • Para la lectura, este subárbol privado se combina con la entrada HKCU\Software no virtualizada para que todas las entradas parezcan estar en el mismo lugar.
  • Cuando se desinstala la aplicación, las entradas virtualizadas ya no están disponibles, ya que nunca se agregaron realmente al Registro.
  • Las claves del subárbol virtualizado solo están visibles para la aplicación.
HKCU Tiempo de ejecución
  • Las escrituras van a un subárbol privado independiente por aplicación y por usuario.
  • Para la lectura, este subárbol se combina con la entrada HKCU no virtualizada para que todas las entradas parezcan estar en el mismo lugar.
  • Cuando se desinstala la aplicación, se quitan las entradas virtualizadas.
  • Las claves del subárbol virtualizado solo están visibles para la aplicación.
HKLM Hora de instalación
  • La aplicación puede incluir un archivo registry.dat que especifique las entradas HKLM\Software. En realidad, estas entradas se escriben en un archivo user.dat de la carpeta AppData del usuario (en una carpeta secundaria para cada aplicación) y se presentan a la aplicación como si las claves estuvieran en HKLM.
  • Para la lectura, este subárbol privado se combina con la entrada HKLM\Software no virtualizada para que todas las entradas parezcan estar en el mismo lugar.
  • Cuando se desinstala la aplicación, las entradas virtualizadas ya no están disponibles, ya que nunca se agregaron realmente al Registro.
  • Las claves del subárbol virtualizado solo están visibles para la aplicación.
HKLM Tiempo de ejecución
  • Las escrituras en HKLM se permiten siempre que no exista una clave o un valor correspondientes en el subárbol del paquete y el usuario tenga los permisos de acceso correctos (lo que significa que esto solo está disponible para una aplicación de Centennial que se ejecute con privilegios elevados).
Carpetas conocidas Hora de instalación
  • La aplicación puede incluir una carpeta VFS con subcarpetas con nombre conocidas que contienen archivos arbitrarios.
  • Para la lectura, estas subcarpetas se combinan con las ubicaciones conocidas no virtualizadas, de modo que todos los archivos parecen estar en el mismo lugar.
AppData Tiempo de ejecución
  • En el caso de las versiones de Windows menores o iguales a 1809, todas las escrituras en la carpeta AppData del usuario (incluida la creación, eliminación y actualización) se copian al escribir en una ubicación privada por usuario y por aplicación que se combina en tiempo de ejecución para aparecer en la ubicación real de AppData.
  • Para las versiones de Windows superiores a 1809, todos los archivos y carpetas recién creados en la carpeta AppData del usuario se escriben en una ubicación privada por usuario y por aplicación que se combina en tiempo de ejecución para mostrarse en la ubicación real de AppData. Las modificaciones en los archivos de AppData existentes se realizan en los archivos no virtualizados. En el caso de las lecturas, el sistema intenta primero la ubicación privada y, a continuación, usa la opción de reserva de AppData sin virtualizar.
  • En la reserva, se permite la escritura en los archivos no virtualizados.
  • Cuando se desinstala la aplicación, se quitan las entradas virtualizadas.
  • Los archivos de la ubicación virtualizada solo están visibles para la aplicación.
  • No hay compatibilidad con VFS para AppData.
  • Además de AppData, la aplicación puede escribir en cualquier ubicación en la que el usuario tenga acceso de escritura, incluidas otras partes de %userprofile% (en que AppData es solo una parte).

La funcionalidad restringida unvirtualizedResources

Nota:

La compatibilidad con la funcionalidad restringida unvirtualizedResources se introdujo en Windows 10, versión 1903 (10.0; compilación 18362), también conocida como Actualización de mayo de 2019 de Windows 10.

La aplicación puede declarar la funcionalidad restringida unvirtualizedResources y definir las propiedades RegistryWriteVirtualization o FilesystemWriteVirtualization en true para obtener acceso de escritura a HKCU o AppData. Esto es para habilitar el caso en el que la aplicación necesita escribir entradas que luego están visibles para otros procesos fuera de su paquete. Por ejemplo, los juegos escriben los datos guardados en AppData y esos datos deben conservarse incluso después de desinstalar el juego.

Propiedad Descripción
RegistryWriteVirtualization=disabled Las escrituras en HKCU van a la ubicación sin virtualizar, son visibles para otros procesos fuera del paquete y no se limpian al desinstalar la aplicación.
FilesystemWriteVirtualization=disabled Las escrituras en AppData van a la ubicación sin virtualizar, son visibles para otros procesos fuera del paquete y no se limpian al desinstalar la aplicación.

Este mecanismo desactiva la virtualización de HKCU o AppData por completo, lo que va en contra del objetivo principal. No es una herramienta detallada y a menudo supera los requisitos de una aplicación determinada.