彈性虛擬化

概觀

彈性虛擬化功能可讓您的應用程式宣告 應該讓其他應用程式看到一組 檔案和登錄專案,而且那些專案應該在應用程式卸載時保存。 其他應用程式看不到所有其他檔案和登錄專案,而且會在卸載時移除。

如何控制所選位置的虛擬化

注意

本節所述的行為是在 Windows 10 版本 21H1 中引進的。

從 Windows 10 版本 21H1 開始,系統會保留未虛擬化Resources 受限制功能的現有行為,以及 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>

注意

如果您的 app 同時宣告 Windows 10 版本 21H1 和 Windows 10 版本 21H1 語法,則舊宣告將會用於 Windows 10 版本 21H1 前版本,而在 Windows 10 版本 21H1 和更新版本上使用新的宣告。

Windows 10 版本 21H1 之前的機制

在傳統環境中,應用程式可以在檔案系統的大部分位置建立、更新和刪除檔案。 他們可以在 Windows 登錄中建立、更新和刪除專案。 這些檔案和登錄項目在系統上的其他應用程式都可以看到,即使這些檔案和登錄專案通常不需要。 此外,卸載應用程式時,這些檔案和登錄專案通常會留下,而且變得雜亂無章。

在 通用 Windows 平台 (UWP) 中,這類檔案和登錄專案會虛擬化,因此只有寫入它們的應用程式可以看到它們。 當應用程式卸載時,就會移除它們。 但在某些情況下,應用程式想要讓其他應用程式看到這類檔案和登錄專案。 此外,其他應用程式可能會要求這些檔案和專案在卸載寫入這些檔案和項目之後仍會保存。

預設 MSIX 行為

Location 內容 描述
HKCU 安裝時間
  • 應用程式可以包含user.dat指定 HKCU\Software 項目的檔案。 這些項目實際上會寫入user.dat使用者的 AppData 資料夾中的檔案(在每個應用程式的子資料夾中),並呈現給應用程式,就像金鑰位於 HKCU一樣。
  • 為了閱讀,此私人Hive會與未虛擬化的HKCU\Software合併,讓所有專案都位於相同的位置。
  • 卸載應用程式時,虛擬化專案將無法再使用,因為它們從未實際新增至登錄。
  • 虛擬化 Hive 中的索引鍵只對應用程式可見。
HKCU 運行時間
  • 寫入會移至個別的個別應用程式、每個使用者私人Hive。
  • 若要讀取,此 Hive 會與未虛擬化的 HKCU 合併,讓所有項目都位於相同位置。
  • 卸載應用程式時,會移除虛擬化專案。
  • 只有應用程式可以看到虛擬化 Hive 中的索引鍵。
HKLM 安裝時間
  • 應用程式可以包含registry.dat指定 HKLM\Software 項目的檔案。 這些項目實際上會寫入user.dat使用者的 AppData 資料夾中的檔案(在每個應用程式的子資料夾中),並呈現給應用程式,就像金鑰位於 HKLM一樣。
  • 為了閱讀,此私人Hive會與未虛擬化的HKLM\軟體合併,讓所有專案都出現在相同的位置。
  • 卸載應用程式時,虛擬化專案將無法再使用,因為它們從未實際新增至登錄。
  • 虛擬化 Hive 中的索引鍵只對應用程式可見。
HKLM 運行時間
  • 只要套件 Hive 中沒有對應的索引鍵/值,且使用者具有正確的訪問許可權,即可在 HKLM寫入 (這實際上表示只有執行提升許可權的 Centennial 應用程式才可使用)。
已知資料夾 安裝時間
  • 應用程式可以包含 具有包含任意檔案之已知具名子資料夾的 VFS 資料夾。
  • 為了讀取,這些子資料夾會與未虛擬化的已知位置合併,讓所有檔案都出現在相同的位置。
AppData 運行時間
  • 對於小於或等於 1809 的 Windows 版本,所有寫入使用者的 AppData 資料夾(包括建立、刪除和更新)都會在寫入至私人每個使用者、每一應用程式位置時複製,這會在運行時間合併,以出現在實際的 AppData 位置。
  • 對於大於 1809 的 Windows 版本,使用者 AppData 資料夾中所有新建立的檔案和資料夾都會寫入私人每個使用者、每個應用程式位置,而每個應用程式位置會在運行時間合併,以出現在實際的 AppData 位置中。 對現有 AppData 檔案的修改會在未虛擬化的檔案上完成。 針對讀取,系統會先嘗試私人位置,然後回復為未虛擬化 的 AppData
  • 在後援時,允許寫入未虛擬化的檔案。
  • 卸載應用程式時,會移除虛擬化專案。
  • 虛擬化位置中的檔案只對應用程式可見。
  • AppData 沒有 VFS 支援
  • 除了 AppData 之外,應用程式還可以寫入使用者具有寫入許可權的任何位置,包括的其他部分%userprofile%(其中 AppData 只是一部分)。

unvirtualizedResources受限制的功能

注意

unvirtualizedResources Windows 10 版本 1903 (10.0) 引進了對受限制功能的支援;組建 18362),也稱為 Windows 10 2019 年 5 月更新。

您的應用程式可以宣告unvirtualizedResources受限制的功能,並將 RegistryWriteVirtualization 和/或 FilesystemWriteVirtualization 屬性設定true,以取得 HKCU 和/或 AppData寫入許可權。 這是為了啟用您的應用程式需要寫入項目的情況,然後讓套件外部的其他進程看到這些專案。 例如,遊戲會將數據 寫入AppData,而且即使在卸載遊戲之後,該數據也需要保存。

屬性 說明
RegistryWriteVirtualization=disabled 寫入 HKCU 會移至未虛擬化的位置、對套件以外的其他進程可見,而且不會在應用程式卸載時清除。
FilesystemWriteVirtualization=disabled 寫入 AppData 會移至未虛擬化的位置、對套件外部的其他進程可見,而且不會在應用程式卸載時清除。

此機制完全關閉 HKCU 和/或 AppData 虛擬化,這與主要目標無關。 這不是精細的工具,而且通常超過指定應用程式的需求。