Гибкая виртуализация

Обзор

Функция гибкой виртуализации позволяет приложению объявить, что некоторый набор файлов и записей реестра должен быть видим другим приложениям и что они должны сохраняться при удалении приложения. Все остальные файлы и записи реестра не видны другим приложениям и удаляются вместе с ним.

Как управлять виртуализацией в выбранных расположениях

Примечание

Поведение, описанное в этом разделе, было реализовано в Windows 10 версии 21H1.

Начиная с Windows 10 версии 21H1 система сохраняет существующее поведение ограниченной возможности unvirtualizedResources, а также свойства RegistryWriteVirtualization и FilesystemWriteVirtualization. Кроме того, система позволяет приложению объявить определенные папки и (или) разделы реестра, которые не должны виртуализироваться.

  • Вы можете объявить только те расположения файловой системы, которые относятся к %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 по умолчанию

Расположение Контекст Описание
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 Время выполнения
  • В версиях Windows, равных или меньше 1809, все операции записи в папку AppData пользователя (в том числе создание, удаление и обновление) копируются в частное расположение отдельного пользователя и отдельного приложения, которое во время выполнения объединяется с реальным расположением AppData.
  • В версиях Windows выше 1809 все новые файлы и папки в папке AppData пользователя записываются в частное расположение отдельного пользователя и отдельного приложения, которое во время выполнения объединяется с реальным расположением AppData. Изменения существующих файлов AppData выполняются с невиртуализованными файлами. Чтобы выполнить чтение, система сначала обращается к частному расположению, а в случае неудачи — к AppData.
  • Во втором случае разрешены записи в невиртуализированные файлы.
  • При удалении приложения виртуализированные записи также удаляются.
  • Файлы в виртуализированном расположении видимы только приложению.
  • Поддержка VFS для AppData отсутствует.
  • Кроме AppData, приложение может выполнять запись в любое расположение, доступное пользователю для записи, в том числе в другие части %userprofile% (к которым также принадлежит AppData).

Ограниченная возможность unvirtualizedResources

Примечание

Поддержка ограниченной возможности unvirtualizedResources была реализована в Windows 10 версии 1903 (10.0; сборка 18362), также известной как обновление Windows 10 за май 2019 г.

Приложение может объявить ограниченную возможность unvirtualizedResources и задать свойства RegistryWriteVirtualization и (или) FilesystemWriteVirtualization для true, чтобы получить доступ для записи к HKCU и (или) AppData. Это необходимо, чтобы приложение могло записывать записи, доступные другим процессам за пределами его пакета. Например, игры записывают данные сохранений в AppData, и эти данные должны сохраняться даже после удаления игры.

Свойство Описание
RegistryWriteVirtualization=disabled Операции записи в HKCU направляются в невиртуализированное расположение, видимы другим процессам за пределами пакета и не удаляются вместе с приложением.
FilesystemWriteVirtualization=disabled Операции записи в AppData направляются в невиртуализированное расположение, видимы другим процессам за пределами пакета и не удаляются с приложением.

Такой механизм полностью отключает виртуализацию HKCU и (или) AppData, что противоречит основной цели. Это универсальное приложение, поэтому часто оно может не соответствовать требованиям конкретного приложения.