Virtualisation flexible

Vue d’ensemble

La fonctionnalité de virtualisation flexible permet à votre application de déclarer qu’un certain ensemble de ses fichiers et entrées de Registre doivent être visibles par d’autres applications, et que ceux-ci doivent persister lors de la désinstallation de l’application. Tous les autres fichiers et entrées de Registre ne sont pas visibles par les autres applications et sont supprimés lors de la désinstallation.

Comment contrôler la virtualisation des emplacements sélectionnés

Remarque

Le comportement décrit dans cette section est apparu pour la première fois dans Windows 10 version 21H1.

Dans Windows 10 version 21H1 et les versions suivantes, le système conserve le comportement existant de la fonctionnalité limitée unvirtualizedResources, ainsi que les propriétés RegistryWriteVirtualization et FilesystemWriteVirtualization. En outre, le système ajoute la possibilité pour votre application de déclarer des dossiers et/ou des clés de Registre que vous souhaitez non virtualisés.

  • Vous pouvez déclarer uniquement les emplacements de système de fichiers qui se trouvent dans %USERPROFILE%\AppData.
  • Vous pouvez uniquement déclarer les emplacements de Registre qui se trouvent dans HKCU.

Prenons un exemple.

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

Remarque

Si votre application déclare à la fois la syntaxe antérieure à celle de Windows 10 version 21H1 et la syntaxe ultérieure à cette version, l’ancienne déclaration sera utilisée sur les versions antérieures, et la nouvelle déclaration sera utilisée à la fois sur les versions antérieures et ultérieures.

Mécanismes existant avant Windows 10 version 21H1

Dans les environnements traditionnels, les applications peuvent créer, mettre à jour et supprimer des fichiers dans le système de fichiers. En outre, elles peuvent créer, mettre à jour et supprimer des entrées dans le Registre Windows. Ces fichiers et entrées de Registre sont visibles par d’autres applications du système, même s’ils n’ont pas besoin de l’être. En outre, lorsque l’application est désinstallée, ces fichiers et entrées de Registre sont souvent oubliés et encombrent l’ordinateur.

Dans la plateforme Windows universelle (UWP), de tels fichiers et entrées de Registre sont virtualisés afin que seule l’application qui les écrit puisse les voir. Ensuite, ils sont supprimés lors de la désinstallation de l’application. Toutefois, il existe des scénarios valides dans lesquels l’application nécessite que ces fichiers et entrées de Registre soient visibles par d’autres applications. En outre, d’autres applications peuvent nécessiter la conservation de ces fichiers et entrées, même après la désinstallation de l’application qui les a écrits.

Comportement MSIX par défaut

Emplacement Context Description
HKCU Au moment de l’installation
  • L’application peut inclure un fichier user.dat qui spécifie des entrées HKCU\Software. Ces entrées sont en fait écrites dans un fichier user.dat situé dans le dossier AppData de l’utilisateur (dans un sous-dossier pour chaque application) et sont présentées à l’application comme si les clés se trouvaient dans HKCU.
  • Pour la lecture, cette ruche privée est fusionnée avec le HKCU\Software non virtualisé afin que toutes les entrées s’affichent au même endroit.
  • Lorsque l’application est désinstallée, les entrées virtualisées ne sont plus disponibles, car elles n’ont jamais été réellement ajoutées au Registre.
  • Les clés de la ruche virtualisée ne sont visibles que par l’application.
HKCU Exécution
  • Les écritures sont placées dans une ruche privée pour chaque application et chaque utilisateur.
  • Pour la lecture, cette ruche est fusionnée avec le HKCU non virtualisé afin que toutes les entrées s’affichent au même endroit.
  • Lorsque l’application est désinstallée, les entrées virtualisées sont supprimées.
  • Les clés de la ruche virtualisée ne sont visibles que par l’application.
HKLM Au moment de l’installation
  • L’application peut inclure un fichier registry.dat qui spécifie des entrées HKLM\Software. Ces entrées sont en fait écrites dans un fichier user.dat situé dans le dossier AppData de l’utilisateur (dans un sous-dossier pour chaque application) et sont présentées à l’application comme si les clés se trouvaient dans HKLM.
  • Pour la lecture, cette ruche privée est fusionnée avec le HKLM\Software non virtualisé afin que toutes les entrées s’affichent au même endroit.
  • Lorsque l’application est désinstallée, les entrées virtualisées ne sont plus disponibles, car elles n’ont jamais été réellement ajoutées au Registre.
  • Les clés de la ruche virtualisée ne sont visibles que par l’application.
HKLM Exécution
  • Les écritures sous HKLM sont autorisées tant qu’il n’existe pas une paire clé/valeur correspondante dans la ruche du package et que l’utilisateur dispose des autorisations d’accès appropriées (autrement dit, ceci n’est disponible que pour une application Centennial exécutée avec des privilèges élevés).
Dossiers connus Au moment de l’installation
  • L’application peut inclure un dossier VFS avec des sous-dossiers nommés connus qui contiennent des fichiers arbitraires.
  • Pour la lecture, ces sous-dossiers sont fusionnés avec les emplacements connus non virtualisés, afin que tous les fichiers s’affichent au même endroit.
AppData Exécution
  • Pour les versions de Windows inférieures ou égales à 1809, toutes les écritures effectuées dans le dossier AppData de l’utilisateur (y compris les opérations de création, de suppression et de mise à jour) sont copiées lors de l’écriture de données dans un emplacement privé par utilisateur et par application, qui est fusionné au moment de l’exécution pour s’afficher dans l’emplacement AppData réel.
  • Pour les versions de Windows supérieures à 1809, tous les fichiers et dossiers nouvellement créés dans le dossier AppData de l’utilisateur sont écrits dans un emplacement privé par utilisateur et par application, qui est fusionné au moment de l’exécution pour s’afficher à l’emplacement AppData réel. Les modifications apportées aux fichiers AppData existants sont effectuées dans les fichiers non virtualisés. Pour les lectures, le système tente d’abord l’emplacement privé, puis revient au dossier AppData non virtualisé.
  • Les écritures dans les fichiers non virtualisés sont alors autorisées.
  • Lorsque l’application est désinstallée, les entrées virtualisées sont supprimées.
  • Les fichiers de l’emplacement virtualisé ne sont visibles que pour l’application.
  • Il n’existe aucune prise en charge VFS pour AppData.
  • Hormis AppData, l’application peut écrire dans n’importe quel emplacement où l’utilisateur a un accès en écriture, y compris d’autres parties de %userprofile% (dont AppData fait partie).

La fonctionnalité limitée unvirtualizedResources

Remarque

La prise en charge de la fonctionnalité limitée unvirtualizedResources est apparue pour la première fois dans Windows 10 version 1903 (10.0; build 18362), qui est également connu sous le nom de « Mise à jour de mai 2019 de Windows 10 ».

Votre application peut déclarer la fonctionnalité limitée unvirtualizedResources et définir les propriétés RegistryWriteVirtualization et/ou FilesystemWriteVirtualization sur true, afin d’accéder en écriture à HKCU et/ou à AppData. Cela permet à votre application d’écrire des entrées qui sont ensuite visibles par d’autres processus en dehors de son package. Par exemple, les jeux écrivent des données dans AppData, et ces données doivent être conservées même après la désinstallation du jeu.

Propriété Description
RegistryWriteVirtualization=disabled Les écritures dans HKCU sont effectuées dans l’emplacement non virtualisé. Elles sont visibles par les autres processus en dehors du package et ne sont pas nettoyées lors de la désinstallation de l’application.
FilesystemWriteVirtualization=disabled Les écritures dans AppData sont effectuées dans l’emplacement non virtualisé. Elles sont visibles par les autres processus en dehors du package et ne sont pas nettoyées lors de la désinstallation de l’application.

Ce mécanisme désactive entièrement la virtualisation HKCU et/ou AppData, ce qui va à l’encontre de l’objectif principal. Cet outil n’est pas précis et dépasse souvent les exigences d’une application donnée.