レジストリ仮想化
レジストリ仮想化 は、グローバルな影響を与えるレジストリ書き込み操作をユーザーごとの場所にリダイレクトできるようにするアプリケーション互換性テクノロジです。 このリダイレクトは、レジストリから読み取ったり、レジストリに書き込んだりするアプリケーションに対して透過的です。 Windows Vista 以降でサポートされています。
この形式の仮想化は、中間アプリケーション互換性テクノロジです。より多くのアプリケーションが 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\に書き込もうとすると、仮想化によって、書き込み操作がユーザー SID>_Classes\VirtualStore\Machine\Software \AppKey1<HKEY_USERS\ にリダイレクトされます。
-
レジストリ仮想化の読み取り
-
呼び出し元が仮想化されたキーから読み取る場合、レジストリは、仮想化された値 (仮想ストアから) と非仮想値 (グローバル ストアから) の両方のマージされたビューを呼び出し元に表示します。
たとえば、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 から削除され、HKEY_LOCAL_MACHINE\Software\AppKey1 値が 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のキーとサブキー。
レジストリ仮想化の制御
管理者は、マニフェストで要求されたExecutionLevel 使用してアプリケーション レベルで仮想化を制御するだけでなく、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.
仮想化されているキーで監査が有効になると、新しい仮想化監査イベントが生成され、キーが仮想化されていることを示します (通常の監査イベントに加えて)。 管理者はこの情報を使用して、システム上の仮想化の状態を監視できます。
関連トピック