共用方式為


彈性虛擬化

概觀

彈性虛擬化功能可讓您的應用程式宣告其 一組 檔案和登錄項目能夠被其他應用程式看見,並在應用程式卸載時仍能持續存在。 所有其他檔案和登錄專案對於其他應用程式不可見,並在卸載時移除。

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

備註

本節所述的行為是在 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 同時宣告 pre-Windows 10 版本 21H1 和 Windows 10 版本 21H1 語法,那麼舊的宣告將用於 pre-Windows 10 版本 21H1 前的版本,而新的宣告將用於 pre-Windows 10 版本 21H1 和之後的版本。

Windows 10 版本 21H1 之前的機制

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

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

預設 MSIX 行為

地點 上下文 說明
香港 CU 安裝時間
  • 應用程式可以包含 user.dat 指定 HKCU\Software 項目的檔案。 這些項目實際上會寫入 user.dat 使用者的 AppData 資料夾中的檔案(在每個應用程式的子資料夾中),並呈現給應用程式,就像金鑰位於 HKCU 中一樣。
  • 為了閱讀,此私人Hive會與未虛擬化的 HKCU\Software 合併,讓所有專案都位於相同的位置。
  • 卸載應用程式時,虛擬化專案將無法再使用,因為它們從未實際新增至登錄。
  • 虛擬化 Hive 中的索引鍵只對應用程式可見。
香港 CU 執行期間
  • 寫入會移至每個應用程式及使用者的私人資料儲存區。
  • 若要讀取,此 Hive 會與未虛擬化的 HKCU 合併,讓所有項目都位於相同位置。
  • 卸載應用程式時,會移除虛擬化的項目。
  • 只有應用程式可以看到虛擬化 Hive 中的索引鍵。
香港電影學院 安裝時間
  • 應用程式可以包含 registry.dat 指定 HKLM\Software 項目的檔案。 這些項目實際上會寫入 user.dat 使用者的 AppData 資料夾中的檔案(在每個應用程式的子資料夾中),並呈現給應用程式,就像金鑰位於 HKLM 中一樣。
  • 為了閱讀,這個私人配置單元會與未經虛擬化的 HKLM\軟體 合併,使所有項目似乎位於同一位置。
  • 卸載應用程式時,虛擬化專案將無法再使用,因為它們從未實際新增至登錄。
  • 虛擬化 Hive 中的索引鍵只對應用程式可見。
香港電影學院 執行期間
  • 只要軟體包 Hive 中不存在相應的索引鍵/值,且使用者具備正確的存取權限,就可以在 HKLM 下進行寫入操作(這實際上表示只有以提升權限執行的 Centennial 應用程式才能使用此功能)。
已知資料夾 安裝時間
  • 應用程式可以包含具有包含任意檔案之已知具名子資料夾的 VFS 資料夾。
  • 為了讀取,這些子資料夾會與未虛擬化的已知位置合併,讓所有檔案都出現在相同的位置。
應用數據 執行期間
  • 對於 Windows 版本小於或等於 1809,所有對使用者的 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=已禁用 寫入 HKCU 會移至未虛擬化的位置、對套件以外的其他進程可見,而且不會在應用程式卸載時清除。
文件系統寫入虛擬化=禁用 寫入 AppData 的資料會傳送至未虛擬化的位置,對於套件外的其他程序可見,且在應用程式解除安裝時不會被清除。

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