彈性虛擬化

概觀

彈性虛擬化功能提供一種方式,讓您的應用程式宣告其他應用程式應該可以看到的 部分 檔案和登錄專案;這應該會在應用程式卸載時保存。 其他應用程式會看到其他所有檔案和登錄專案;卸載時,會移除和。

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

注意

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

從 Windows 10 版21H1 開始,系統會保留unvirtualizedResources限制功能的現有行為,以及RegistryWriteVirtualizationFilesystemWriteVirtualization屬性。 此外,系統也會新增應用程式的功能,以宣告您想要 unvirtualized 的特定資料夾和/或登錄機碼。

  • 您只能宣告內的檔案系統位置 %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) 中,這類檔案和登錄專案都是虛擬化的,因此只有寫入它們的應用程式才能看到它們。 當應用程式卸載時,就會將它們移除。 但在某些情況下,應用程式會想要讓其他應用程式可以看見這類檔案和登錄專案。 此外,其他應用程式可能會要求這些檔案和專案即使在寫入它們的應用程式卸載之後仍會保存。

預設傳統型橋接器行為

位置 Context Description
HKCU 安裝時間
  • 應用程式可以包含 user.dat 指定user.dat\\專案的檔案。 這些專案實際上會寫入至 user.dat 使用者 user.dat 資料夾中的檔案, (在每個應用程式) 的子資料夾中,並顯示到應用程式,就像是 HKCU中的金鑰一樣。
  • 為了讀取,此私用 hive 會與 unvirtualized HKCU軟體合併,讓所有專案都出現在相同的位置。
  • 當應用程式卸載時,虛擬化專案將無法再使用,因為它們絕對不會新增至登錄。
  • 只有應用程式才能看見虛擬化 hive 中的金鑰。
HKCU 執行時間
  • 寫入會移至個別應用程式、每個使用者的私用 hive。
  • 為了讀取,此 hive 會與 unvirtualized HKCU 合併,讓所有專案都出現在相同的位置。
  • 卸載應用程式時,會移除虛擬化的專案。
  • 只有應用程式才能看見虛擬化 hive 中的金鑰。
HKLM\ 安裝時間
  • 應用程式可以包含 registry.dat 指定registry.dat\\專案的檔案。 這些專案實際上會寫入至 user.dat 使用者 user.dat 資料夾中的檔案, (在每個應用程式) 的子資料夾中,並顯示到應用程式,就像是在 HKLM中的金鑰一樣。
  • 為了讀取,此私用 hive 會與 unvirtualized HKLM軟體合併,讓所有專案都出現在相同的位置。
  • 當應用程式卸載時,虛擬化專案將無法再使用,因為它們絕對不會新增至登錄。
  • 只有應用程式才能看見虛擬化 hive 中的金鑰。
HKLM\ 執行時間
  • 只要套件登錄區中沒有對應的索引鍵/值,而且使用者具有正確的訪問 (許可權,就可以在 HKLM 下進行寫入,如此一來,就能有效地表示這只適用于執行提升) 的 Centennial 應用程式。
知名資料夾 安裝時間
  • 應用程式可包含具有已知之命名子資料夾的 VFS 資料夾,其中包含任意檔案。
  • 若要讀取,這些子資料夾會與 unvirtualized 的已知位置合併,讓所有檔案看起來都在相同的位置。
AppData 執行時間
  • 針對小於或等於1809的 Windows 版本,系統會在寫入至私用個別使用者、每個應用程式的位置時,將所有寫入至使用者的AppData資料夾 (包括建立、刪除和更新) ,並在執行時間合併以顯示于實際AppData位置。
  • 如果 Windows 版本大於1809,則會將使用者 [ AppData ] 資料夾中所有新建立的檔案和資料夾寫入至私用每位使用者、每個應用程式的位置,此位置會在執行時間合併,以顯示在實際AppData位置中。 對現有 AppData 檔案的修改會在 unvirtualized 檔案上完成。 針對讀取,系統會先嘗試私人位置,然後切換回 unvirtualized AppData
  • 在回復時,會允許寫入至 unvirtualized 檔案。
  • 卸載應用程式時,會移除虛擬化的專案。
  • 只有應用程式才能看見虛擬化位置中的檔案。
  • AppData沒有任何 VFS 支援。
  • 除了 AppData之外,應用程式可以寫入至使用者具有寫入權限的任何位置,包括 (的其他部分, 其中 AppData 只是) 的部分。

unvirtualizedResources限制的功能

注意

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

您的應用程式可以宣告 unvirtualizedResources 受限的功能,並將 unvirtualizedResources 和/或 FilesystemWriteVirtualization 屬性設定為 ,以取得 HKCU 和/或 AppData的寫入存取權。 這是為了讓您的應用程式必須撰寫可在其套件以外的其他進程看見的專案時,才會發生這種情況。 例如,遊戲會將儲存資料寫入 AppData,而且即使在卸載遊戲之後也需要保存資料。

屬性 描述
RegistryWriteVirtualization = 已停用 寫入 HKCU 移至 unvirtualized 位置,套件之外的其他進程可以看見,而且不會在應用程式卸載時清除。
FilesystemWriteVirtualization = 已停用 寫入至 AppData 移至 unvirtualized 位置、套件外的其他進程可以看見,而且不會在應用程式卸載時清除。

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