彈性虛擬化

概述

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

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

注意

本節所述的行為是在 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 Context 描述
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\Software合併,讓所有專案都出現在相同的位置。
  • 卸載應用程式時,虛擬化專案將無法再使用,因為它們從未實際新增至登錄。
  • 虛擬化 Hive 中的索引鍵只會對應用程式顯示。
HKLM 執行時間
  • 只要套件 hive 中沒有對應的索引鍵/值,就允許 HKLM 下的寫入,而且使用者具有正確的存取權限 (,這實際上表示這只適用于執行提升許可權的 Centennial 應用程式) 。
已知的資料夾 安裝時間
  • 應用程式可以包含具有包含任意檔案之已知具名子資料夾的 VFS 資料夾。
  • 為了讀取,這些子資料夾會與未虛擬化的已知位置合併,讓所有檔案都出現在相同的位置。
AppData 執行時間
  • 對於小於或等於 1809 的 Windows 版本,所有寫入使用者的 AppData 資料夾 (包括建立、刪除和更新) 都會在寫入至私人每個使用者、個別應用程式位置時複製,該位置會在執行時間合併,以出現在實際的 AppData 位置。
  • 對於大於 1809 的 Windows 版本,使用者 AppData 資料夾中所有新建立的檔案和資料夾都會寫入至執行時間合併的私人個別使用者、每個應用程式位置,以出現在實際的 AppData 位置。 對現有 AppData 檔案所做的修改是在未虛擬化的檔案上完成。 針對讀取,系統會先嘗試私人位置,然後回復至未虛擬化 的 AppData
  • 在後援上,允許寫入未虛擬化的檔案。
  • 卸載應用程式時,會移除虛擬化專案。
  • 虛擬化位置中的檔案只會對應用程式顯示。
  • AppData沒有 VFS 支援。
  • 除了AppData之外,應用程式還可以寫入使用者可寫入存取權的任何位置,包括AppData只是其中一個部分) (的其他部分 %userprofile%

unvirtualizedResources受限制的功能

注意

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

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

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

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