Windows レジストリ リフレクションの削除

プラットフォーム

クライアント - Windows 7
サーバー - Windows Server 2008 R2

機能への影響

重大度 - 低
頻度 - 低

Description

レジストリ リフレクション プロセスでは、2 つのレジストリ ビュー間でレジストリ キーと値がコピーされ、同期が維持されます。Windows の以前の 64 ビット インストールでは、32 ビット ビューと 64 ビット ビューの間にリダイレクトされたレジストリ キーのサブセットがプロセスに反映されました。 ただし、これを実装すると、レジストリの状態に一部の不整合が発生しました。 (レジストリ リフレクションの詳細については、以下の「 その他のリソースへのリンク 」セクションの対応する MSDN の記事を参照してください)。

Windows 7 以降では、レジストリリフレクションが完全に削除され、以前に反映されたキーがマージされました。

  • HKEY_LOCAL_MACHINE\Software\Classes
  • HKEY_LOCAL_MACHINE\Software\Microsoft\COM3
  • HKEY_LOCAL_MACHINE\Software\Microsoft\EventSystem
  • HKEY_LOCAL_MACHINE\Software\Microsoft\Ole
  • HKEY_LOCAL_MACHINE\Software\Microsoft\Rpc
  • HKEY_USERS\*\Software\Classes
  • HKEY_USERS\*_Classes

これらのキーの変更は 32 ビットと 64 ビットの両方のアプリケーションですぐに使用できるため、事実上、これは同じリフレクション動作を提供します。

条件付きで反映されたキーは分割されたままです。

  • HKEY_LOCAL_MACHINE\Software\Classes\CLSID
  • HKEY_LOCAL_MACHINE\Software\Classes\Interface
  • HKEY_USERS\*\Software\Classes\CLSID
  • HKEY_USERS\*\Software\Classes\Interface
  • HKEY_USERS\*_Classes\CLSID
  • HKEY_USERS\*_Classes\Interface

これらは、32 ビットと 64 ビットのアプリケーション間で共有してはならないデータを保持するために使用されます。

症状

上記の一覧の CLSID キーとインターフェイス キーは、リダイレクト中はもう反映されません。 これはほとんどの場合、望ましい動作ですが、アプリケーションが Vista で反映された動作に依存する可能性があります。

アプリケーションがリフレクション (RegDisableReflectionKey と RegEnableReflectionKey) を制御できるようにする関数は、Windows 7 では操作を行いません。

影響の軽減

COM は、レジストリ リフレクションの主要なコンシューマーです。 COM およびその他のコンシューマーは、この変更に対応するように更新されました。 この変更は、標準 COM API を使用するアプリケーションには影響しません。

解決策

レジストリ リフレクションに依存して 32 ビットビューと 64 ビット ビューを同期する場合は、次のいずれかのオプションを適用します。

  • インストール中に両方のビューにキーを明示的に作成する

  • 反映されたキーのスコープからキーを移動する

  • 反映されたキーのクエリを実行するときに、レジストリの両方のビューを確認する

    メモ: KEY_WOW64_32KEYフラグとKEY_WOW64_64KEY フラグを組み合わせることはできません

レジストリ リフレクションを無効にするために RegDisableReflectionKey 関数に依存している場合は、次のいずれかのオプションを適用します。

  • インストール中に両方のビューにキーを明示的に作成する
  • 反映されたキーのスコープからキーを移動する
  • プラットフォーム固有のサブキー (x86、amd64、ia64 など) を使用してビット数固有のデータを分離する

Note

これらのリソースは、一部の言語や国/地域では使用できない場合があります。