次の方法で共有


柔軟な仮想化

概要

柔軟な仮想化機能を使用すると、アプリで一 のファイルとレジストリ エントリを他のアプリに表示する必要があることを宣言できます。アプリのアンインストール時に保持する必要があります。 他のすべての ファイルとレジストリ エントリは、他のアプリには表示 されません 。アンインストール時に削除されます。

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

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

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

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

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

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

既定の MSIX 動作

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

制限付き機能 unvirtualizedResources

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

アプリでは、 unvirtualizedResources 制限された機能を宣言し、 RegistryWriteVirtualization プロパティまたは FilesystemWriteVirtualization プロパティを trueに設定して、 HKCUAppData への書き込みアクセスを取得できます。 これは、アプリがそのパッケージの外部にある他のプロセスに表示されるエントリを書き込む必要がある場合に有効にするためです。 たとえば、ゲームは保存データを AppData に書き込み、ゲームがアンインストールされた後もデータを保持する必要があります。

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

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