レジストリ仮想化

レジストリ仮想化 は、グローバルな影響を与えるレジストリ書き込み操作をユーザーごとの場所にリダイレクトできるようにするアプリケーション互換性テクノロジです。 このリダイレクトは、レジストリからの読み取りまたはレジストリへの書き込みを行うアプリケーションに対して透過的です。 Windows Vista 以降でサポートされています。

この形式の仮想化は、中間アプリケーション互換性テクノロジです。Microsoft は、Windows Vista 以降のバージョンの Windows と互換性のあるアプリケーションが増えるので、今後のバージョンの Windows オペレーティング システムから削除する予定です。 そのため、アプリケーションがシステム内のレジストリ仮想化の動作に依存しないようにすることが重要です。

仮想化は、既存のアプリケーションとの互換性を提供することのみを目的としています。 Windows Vista 以降のバージョンの Windows 用に設計されたアプリケーションは、機密性の高いシステム領域に書き込むべきではありません。また、問題を解決するために仮想化に依存する必要もありません。 Windows Vista 以降のバージョンの Windows で実行するように既存のコードを更新する場合、開発者は、アプリケーションがアクセス制御リスト (ACL) を適切に使用する %alluserprofile% 内のユーザーごとの場所またはコンピューターの場所にのみデータを格納するようにする必要があります。

UAC 準拠アプリケーションの構築の詳細については、 UAC 開発者ガイドを参照してください。

仮想化の概要

Windows Vista より前のバージョンでは、通常、アプリケーションは管理者によって実行されていました。 その結果、アプリケーションはシステム ファイルとレジストリ キーに自由にアクセスできます。 これらのアプリケーションが標準ユーザーによって実行された場合、アクセス権が不足しているために失敗します。 Windows Vista 以降のバージョンの Windows では、これらの操作を自動的にリダイレクトすることで、これらのアプリケーションのアプリケーションの互換性が向上します。 たとえば、グローバル ストア (HKEY_LOCAL_MACHINE\Software) へのレジストリ操作は、仮想ストア (HKEY_USERS\User SID>_Classes\<VirtualStore\Machine\Software) と呼ばれるユーザープロファイル内のユーザーごとの場所にリダイレクトされます。

レジストリ仮想化は、次の種類に大きく分類できます。

レジストリ仮想化を開く

呼び出し元がキーへの書き込みアクセス権を持っていない場合、キーを開こうとすると、その呼び出し元に対して許可されている最大アクセス権でキーが開かれます。

キーに対して REG_KEY_DONT_SILENT_FAIL フラグが設定されている場合、操作は失敗し、キーは開かれていません。 詳細については、このトピックで後述する「レジストリ仮想化の制御」を参照してください。

レジストリ仮想化の書き込み

呼び出し元がキーへの書き込みアクセス権を持っていない場合、そのキーへの値の書き込みまたはサブキーの作成を試みると、その値は仮想ストアに書き込まれます。

たとえば、制限付きユーザーが AppKey1HKEY_LOCAL_MACHINE\Software\キーに値を書き込もうとすると、仮想化によって書き込み操作が HKEY_USERS\<User SID>_Classes\VirtualStore\Machine\Software\AppKey1 にリダイレクトされます。

レジストリ仮想化の読み取り

呼び出し元が仮想化されたキーから読み取る場合、レジストリは、仮想化された値 (仮想ストアから) と非仮想値 (グローバル ストアから) の両方のマージされたビューを呼び出し元に表示します。

たとえば、 HKEY_LOCAL_MACHINE\Software\AppKey1 に 2 つの値 V1 と V2 が含まれており、制限付きユーザーが値 V3 をキーに書き込んだとします。 ユーザーがこのキーから値を読み取ろうとすると、マージされたビューには、グローバル ストアの値 V1 と V2、仮想ストアの値 V3 が含まれます。

仮想値が存在する場合は、グローバル値よりも優先されることに注意してください。 上記の例では、グローバル ストアにこのキーの下に値 V3 が含まれている場合でも、値 V3 は仮想ストアから呼び出し元に返されます。 仮想ストアから V3 を削除した場合、V3 はグローバル ストアから返されます。 つまり、V3 を HKEY_USERS\User SID>_Classes\<VirtualStore\Machine\Software\AppKey1 から削除し、AppKey1HKEY_LOCAL_MACHINE\Software\値 V3 を持っている場合、その値はグローバル ストアから返されます。

レジストリ仮想化スコープ

レジストリ仮想化は、次の場合にのみ有効になります。

  • 32 ビットの対話型プロセス。
  • HKEY_LOCAL_MACHINE\Software内のキー。
  • 管理者が書き込むことができるキー。 (管理者がキーに書き込めない場合は、管理者が実行した場合でも、以前のバージョンの Windows でアプリケーションが失敗した可能性があります)。

レジストリ仮想化は、次の場合に無効になっています。

  • 64 ビット プロセス。

  • サービスなど、対話型ではないプロセス。

    サービス (または仮想化が有効になっていない他のプロセス) とアプリケーションの間のプロセス間通信 (IPC) メカニズムとしてレジストリを使用すると、キーが仮想化されている場合、アプリケーションは正しく動作しないことに注意してください。 たとえば、ウイルス対策サービスがアプリケーションによって設定された値に基づいて署名ファイルを更新した場合、サービスはグローバル ストアから読み取るが、アプリケーションは仮想ストアに書き込むため、その署名ファイルは更新されません。

  • ユーザーを偽装するプロセス。 ユーザーの偽装中にプロセスが操作を試行した場合、その操作は仮想化されません。

  • ドライバーなどのカーネル モード プロセス。

  • マニフェストで requestedExecutionLevel が指定されているプロセス。

  • HKEY_LOCAL_MACHINE\Software\Classes、HKEY_LOCAL_MACHINE\Software\Microsoft\Windows 、および HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT のキーとサブキー。

レジストリ仮想化の制御

管理者は、マニフェストで requestedExecutionLevel を使用してアプリケーション レベルで仮想化を制御するだけでなく、HKEY_LOCAL_MACHINE\Softwareのキーに対してキーごとに仮想化 有効または無効にすることができます。 これを行うには、次の表に示すフラグと共にReg.exeコマンド ライン ユーティリティ FLAGS オプションを使用します。

フラグ 説明
REG_KEY_DONT_SILENT_FAIL このフラグは、開いているレジストリの仮想化を無効にします。 このフラグが設定されていて、仮想化が有効になっているキーで開いている操作が失敗した場合、レジストリはキーを再度開こうとしません。 このフラグがクリアされている場合、レジストリは、要求されたアクセスではなく、MAXIMUM_ALLOWEDアクセス権を持つキーを再度開こうとします。
REG_KEY_DONT_VIRTUALIZE このフラグは、書き込みレジストリの仮想化を無効にします。 このフラグが設定され、呼び出し元が親キーに対する十分なアクセス権を持っていないためにキーの作成操作または値の設定操作が失敗した場合、レジストリは操作に失敗します。 このフラグが明確な場合、レジストリは仮想ストア内のキーまたは値の書き込みを試みます。 呼び出し元には、親キーのKEY_READ権限が必要です。
REG_KEY_RECURSE_FLAG このフラグが設定されている場合、レジストリ仮想化フラグは親キーから伝達されます。 このフラグが明確な場合、レジストリ仮想化フラグは反映されません。 このフラグを変更すると、フラグの変更後に作成された新しい子孫キーにのみ影響します。 既存の子孫キーに対してこれらのフラグは設定またはクリアされません。

 

次の例では、Reg.exeコマンド ライン ユーティリティと FLAGS オプションを使用して、仮想化フラグの状態に対してキーのクエリを実行する方法を示します。

C:\>reg flags HKLM\Software\AppKey1 QUERY

HKEY_LOCAL_MACHINE\Software\AppKey1

        REG_KEY_DONT_VIRTUALIZE: CLEAR
        REG_KEY_DONT_SILENT_FAIL: CLEAR
        REG_KEY_RECURSE_FLAG: CLEAR

The operation completed successfully.

仮想化されているキーに対して監査が有効になっている場合は常に、キーが仮想化されていることを示す新しい仮想化監査イベントが生成されます (通常の監査イベントに加えて)。 管理者はこの情報を使用して、システム上の仮想化の状態を監視できます。

ユーザー アカウント制御を使用したはじめに

ユーザー アカウント制御の概要と構成

Developer Best Practices and Guidelines for Applications in a Least Privileged Environment (権限が最小限の環境でのアプリケーション開発者のベスト プラクティスとガイドライン)