私は一連の C# (v2) アプリを持っており、Win7 (およびそれほどではないが Vista) でのレジストリ仮想化に苦労しています。
アプリケーションが HKLM\Software\Company にアクセスする必要がある共有レジストリ構成領域があります。
このコードは、そのレジストリ キーへの書き込みの失敗を適切に検出し、適切にフォールバックします (代わりに HKCU に書き込み、適用した設定が現在のユーザーにのみ影響することをユーザーに通知します)。
Vista では、HKLM 書き込みに使用していたアクセス チェックがサイレントに「成功」し、代わりに HKCR\VirtualStore\Machine... に仮想化されるため、レジストリの仮想化によってこれらすべてが壊れていました。この場合、ユーザーはマシン全体の構成を保存したと考えますが、代わりに仮想ストアに書き込んだだけです。
悲しいことに、HKLM reg キーのアクセス許可を列挙しようとしても、ユーザーがアクセスしているかどうかに関係なく、ユーザーがアクセスできることを示す結果が明示的に返されます。
Vista のサポートを追加したときに使用した回避策は、HKLM へのプローブ書き込みを実行することでした...次に、HKCR\VirtualStore\Machine... で同じ値をチェックインし、値が見つかった場合は仮想化が行われたことに注意してください。
明示的な仮想ロケーション (HKCR) に対するクエリは、書き込みが仮想化されていない場合でも、HKLM ロケーションからマージされた結果を表示するようになったため、Win7 はこれを (再び) 破ったようです。
これを回避するための提案はありますか?
制約: - 昇格を必要とせずに機能するソリューションが必要です (管理者レベルのアクセス許可がない場合、HKCU でユーザーごとの構成にフォールバックしますが、このケースを確実に検出できる必要があります)。
v2 C# アプリで動作する必要があります (C++ コードで見たオプションの 1 つは、.exe の仮想化を無効にするマニフェストを埋め込むことですが、C# V2 ではそれを行うことができませんでした。Windows でフォルダーの仮想化を無効にするを参照してください) .
「インストーラー」なしで動作する必要があります (これにより、REG FLAGS... コマンドで必要なレジストリ キーの仮想化を無効にすることができなくなります)。