灵活虚拟化

概述

灵活的虚拟化功能为应用提供了一种方法,用于声明其 一组 文件和注册表项应该对其他应用可见;这些应用应在应用卸载时保留。 所有其他 文件和注册表项对其他应用 可见;并在卸载时删除。

如何控制所选位置的虚拟化

注释

本部分介绍的行为是在 Windows 10 版本 21H1 中引入的。

从 Windows 10 版本 21H1 开始,系统保留非虚拟化资源受限功能的现有行为,以及RegistryWriteVirtualizationFilesystemWriteVirtualization属性。 此外,系统还添加了应用声明要取消虚拟化的特定文件夹和/或注册表项的功能。

  • 你只能声明%USERPROFILE%\AppData内部的文件系统位置。
  • 您只能声明注册表位置在 HKCU 中的。

下面是一个示例。

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

注释

如果你的应用程序同时声明了旧的 Windows 10 版本 21H1 之前的语法和新的 Windows 10 版本 21H1 语法,则旧声明将在 Windows 10 版本 21H1 之前的版本上使用,而新声明将在 Windows 10 版本 21H1 及更高版本上使用。

Windows 10 版本 21H1 之前的机制

在传统环境中,应用可以在文件系统中的大多数位置创建、更新和删除文件。 他们可以在 Windows 注册表中创建、更新和删除条目。 这些文件和注册表项对系统上的其他应用可见,即使它们通常不需要。 此外,卸载应用时,这些文件和注册表项通常会留下,并变得混乱。

在通用 Windows 平台(UWP)中,此类文件和注册表项会虚拟化,以便只有写入它们的应用才能看到它们。 卸载应用时会将其删除。 但在某些情况下,应用希望此类文件和注册表项对其他应用可见。 此外,其他应用可能要求这些文件和条目在卸载写入它们的应用后仍保留。

默认 MSIX 行为

位置 上下文 DESCRIPTION
HKCU 安装时间
  • 该应用可包含一个 user.dat 文件,该文件指定 HKCU\Software 条目。 这些条目实际上被 user.dat 写入用户的 AppData 文件夹中的文件(在每个应用的子文件夹中),并呈现给应用,就像密钥在 HKCU 中一样。
  • 针对读取,此专用配置单元与未虚拟化的 HKCU\Software 合并,以便所有条目看起来都位于同一位置
  • 卸载应用后,虚拟化条目不再可用,因为它们实际上从未添加到注册表中。
  • 虚拟化配置单元中的密钥仅对应用可见。
HKCU 运行时间
  • 写入会转到单独的每应用、每用户专用配置单元。
  • 针对读取,此配置单元与未虚拟化的 HKCU 合并,以便所有条目看起来都位于同一位置。
  • 卸载应用后,将删除虚拟化条目。
  • 虚拟化配置单元中的密钥仅对应用可见。
HKLM 安装时间
  • 该应用可包含一个 registry.dat 文件,该文件指定 HKLM\Software 条目。 这些条目实际上写入 user.dat 用户的 AppData 文件夹中的文件(在每个应用的子文件夹中),并呈现给应用,就像密钥在 HKLM 中一样。
  • 针对读取,此专用配置单元与未虚拟化的 HKLM\Software 合并,以便所有条目看起来都位于同一位置
  • 卸载应用后,虚拟化条目不再可用,因为它们实际上从未添加到注册表中。
  • 虚拟化配置单元中的密钥仅对应用可见。
HKLM 运行时间
  • 只要包配置单元中不存在相应的键/值,并且用户具有正确的访问权限,便允许 HKLM 下的写入(这实际上意味着这仅适用于运行提升的 Centennial 应用)
已知文件夹 安装时间
  • 该应用可以包含包含任意文件的已知命名子文件夹的 VFS 文件夹。
  • 为了读取,这些子文件夹与未虚拟化的已知位置合并,以便所有文件似乎都位于同一位置。
AppData 运行时间
  • 对于小于或等于 1809 的 Windows 版本,对用户的 AppData 文件夹(包括创建、删除和更新)的所有写入都会在写入时复制到专用的按用户、每应用位置(在运行时合并)以显示在实际 AppData 位置。
  • 若 Windows 版本高于 1809,则用户的“AppData”文件夹中所有新建的文件和文件夹都将写入特定于用户和应用的专用位置,但在运行时将会合并,以在实际的 AppData 位置显示。 对现有 AppData 文件的修改是在未虚拟化的文件中完成的。 对于读取操作,系统首先尝试专用位置,然后回退到未虚拟化的AppData
  • 回退时,允许写入未虚拟化的文件。
  • 卸载应用后,将删除虚拟化条目。
  • 虚拟化位置中的文件仅对应用可见。
  • 没有对 AppData 的 VFS 支持。
  • 除了 AppData,应用还可以写入用户具有写入访问权限的任何位置,包括其他部分 %userprofile% (其中 AppData 只是一部分)。

unvirtualizedResources 受限功能

注释

Windows 10 版本 1903(10.0; 编译版本 18362)中引入了 unvirtualizedResources 限制性功能的支持,也称为 Windows 10 2019 年五月更新。

应用可以声明 unvirtualizedResources 受限功能,并将 RegistryWriteVirtualization 和/或 FilesystemWriteVirtualization 属性设置为 true,以获取 对 HKCU 和/或 AppData 的写入访问权限。 这是为了支持以下情况:应用需要编写随后对包外部的其他进程可见的条目。 例如,游戏会将数据写入 AppData,并且即使在卸载游戏后,该数据也需要保留。

资产 DESCRIPTION
RegistryWriteVirtualization=disabled 写入 HKCU 会转到未虚拟化的位置,对包外的其他进程可见,并且不会在应用卸载时清除。
FilesystemWriteVirtualization=已禁用 写入AppData的数据会被存储到未虚拟化的位置,这些数据对包外部的其他进程可见,并且应用卸载时不会被清除。

此机制完全关闭 HKCU 和/或 AppData 虚拟化,这违背了主要目标。 它不是一个细致的工具,通常会超出某特定应用的需求。