柔軟な仮想化

概要

柔軟な仮想化機能を使用すると、アプリでは、そのファイルおよびレジストリ エントリの "一部のセット" が他のアプリから認識され、アプリのアンインストール時に保持されるように宣言することができます。 "他のすべての" ファイルおよびレジストリ エントリは他のアプリから認識 "されず"、アンインストール時に削除されます。

選択した場所の仮想化を制御する方法

Note

このセクションで説明する動作は 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>

Note

アプリで Windows 10 バージョン 21H1 以前と Windows 10 バージョン 21H1 の構文の両方が宣言されている場合、以前の宣言は Windows 10 バージョン 21H1 以前のバージョンで使用され、新しい宣言は Windows 10 バージョン 21H1 以降で使用されます。

Windows 10 バージョン 21H1 以前のメカニズム、

従来の環境では、アプリはファイルシステムのほとんどの場所でファイルの作成、更新、および削除を行うことができます。 また、Windows レジストリのエントリを作成、更新、削除することもできます。 これらのファイルおよびレジストリ エントリは、 (多くの場合その必要がなくても) システム上の他のアプリから認識することができます。 さらに、アプリがアンインストールされると、これらのファイルおよびレジストリ エントリは多くの場合残され、煩雑になります。

ユニバーサル Windows プラットフォーム (UWP) では、このようなファイルおよびレジストリ エントリは仮想化されるので、それらを書き込むアプリのみに認識されます。 また、アプリがアンインストールされると削除されます。 ただし、このようなファイルおよびレジストリ エントリを他のアプリから認識できるようにするのが有効なシナリオがあります。 また、ファイルやエントリを記述したアプリがアンインストールされた後でも、他のアプリでそれらが保持されることが必要な場合があります。

既定の MSIX 動作

場所 Context 説明
HKCU インストール日時
  • アプリには、HKCU\Software エントリを指定する user.dat ファイルを含めることができます。 これらのエントリは、実際には、 ユーザーの AppData フォルダー (各アプリのサブフォルダー内) にある user.dat ファイルに書き込まれ、キーが HKCU 内にあるかのようにアプリに提示されます。
  • 読み取りのために、このプライベート Hive は、仮想化されていない HKCU\Software にマージされるので、すべてのエントリが同じ場所にあるように見えます。
  • 仮想化されたエントリは実際にはレジストリに追加されていないため、アプリがアンインストールされると使用できなくなります。
  • 仮想化された Hive 内のキーは、アプリにのみ認識されます。
HKCU 実行時間
  • 書き込みは、アプリごと、ユーザーごとの個別のプライベート Hive に送られます。
  • 読み取りのために、このプライベート Hive は、仮想化されていない HKCU にマージされるので、すべてのエントリが同じ場所にあるように見えます。
  • アプリがアンインストールされると、仮想化されたエントリが削除されます。
  • 仮想化された Hive 内のキーは、アプリにのみ認識されます。
HKLM インストール日時
  • アプリには、HKLM\Software エントリを指定する registry.dat ファイルを含めることができます。 これらのエントリは、実際には、 ユーザーの AppData フォルダー (各アプリのサブフォルダー内) にある user.dat ファイルに書き込まれ、キーが HKLM 内にあるかのようにアプリに提示されます。
  • 読み取りのために、このプライベート Hive は、仮想化されていない HKLM\Software にマージされるので、すべてのエントリが同じ場所にあるように見えます。
  • 仮想化されたエントリは実際にはレジストリに追加されていないため、アプリがアンインストールされると使用できなくなります。
  • 仮想化された Hive 内のキーは、アプリにのみ認識されます。
HKLM 実行時間
  • HKLM の下の書き込みは、対応するキー/値がパッケージ Hive に存在せず、ユーザーが適切なアクセス許可を持っている限り、許可されます (事実上、これは管理者特権で実行されている Centennial アプリでのみ使用可能であることを意味します)。
既知のフォルダー インストール日時
  • アプリには、任意のファイルが含まれる、既知の名前付きサブフォルダーを持つ VFS フォルダーを含めることができます。
  • 読み取りのために、これらのサブフォルダーは、仮想化されていない既知の場所にマージされるため、すべてのファイルが同じ場所にあるように見えます。
AppData 実行時間
  • 1809 以前の Windows バージョンでは、ユーザーの AppData フォルダーへのすべての書き込み (作成、削除、更新を含む) が、ユーザーごと、アプリごとのプライベートな場所への書き込み時にコピーされます。これは、実行時にマージされて、実際の AppData の場所に表示されます。
  • 1809 より新しい Windows バージョンでは、ユーザーの AppData フォルダーに新しく作成されたすべてのファイルとフォルダーは、ユーザーごと、アプリごとのプライベートな場所に書き込まれ、実際の AppData の場所に表示されるように、実行時にマージされます。 既存の AppData ファイルに対する変更は、仮想化されていないファイルで行われます。 読み取りのために、システムはまずプライベートな場所を試行し、次に仮想化されていない AppData にフォールバックします。
  • フォールバック時に、仮想化されていないファイルへの書き込みが許可されます。
  • アプリがアンインストールされると、仮想化されたエントリが削除されます。
  • 仮想化された場所にあるファイルは、アプリにのみ認識されます。
  • AppData では VFS はサポートされていません。
  • AppData とは別に、アプリは、ユーザーが書き込みアクセス権を持っている任意の場所に書き込むことができます。これには、%userprofile% (AppData はその一部です) の他の部分が含まれます。

unvirtualizedResources 制限付き機能

Note

unvirtualizedResources 制限付き機能のサポートは、Windows 10 May 2019 Update とも呼ばれる、Windows 10 バージョン 1903 (10.0、ビルド 18362) で導入されました。

アプリでは、unvirtualizedResources 制限付き機能を宣言し、RegistryWriteVirtualization または FilesystemWriteVirtualization プロパティ (あるいはその両方) を true に設定して、HKCU または AppData (あるいはその両方) への書き込みアクセスを取得できます。 これは、アプリが、パッケージの外部にある他のプロセスから認識できるエントリを書き込む必要がある場合に使用します。 たとえば、ゲームが AppData にセーブデータを書き込み、ゲームがアンインストールされた後でもそのデータを保持する必要がある場合です。

プロパティ 説明
RegistryWriteVirtualization=disabled HKCU への書き込みは、仮想化されていない場所に移動し、パッケージの外部にある他のプロセスから認識でき、アプリのアンインストール時にクリーンアップされません。
FilesystemWriteVirtualization=disabled AppData への書き込みは、仮想化されていない場所に移動し、パッケージの外部にある他のプロセスから認識でき、アプリのアンインストール時にクリーンアップされません。

このメカニズムにより、HKCUAppData の仮想化が完全にオフになります。これは、主な目的に反するものです。 これは細かい設定が可能なツールではなく、多くの場合、特定のアプリの要件を超えています。