.NETからhkey_local_machineへの書き込みは、VistaまたはWindows 7で仮想化されませんか?
-
23-10-2019 - |
質問
Vistaおよび/またはWindows 7でのレジストリ操作の仮想ストアの仮想化を理解するのに苦労しています。 hkey_local_machine 標準ユーザーとして実行中にルートを実行すると、Windowsに操作を仮想化し、に書き込みます hkey_current_user/classes/virtualstore/machine 代わりは。いくつかの古いアプリケーションがそのように振る舞うのを見てきました。
ただし、C#と.NET4でその動作を再現しようとすると、HKLMへの書き込み操作はただ失敗します UnauthorizedAccesSexception 代わりは。仮想化を強制する方法はありますか?
質問にいくつかのコンテキストを提供するために、私は別のレガシーアプリによって最初に作成されたレジストリキーを読んで操作しようとしています。 VistaまたはWindows 7では、これらはVirtualStoreにあります。 Winxp以降の両方で同じレジストリアクセスロジックを使用したいと思いますが、レジストリ操作はレガシーアプリの操作と同じように仮想化されると考えています(そのため、同じキーで動作します)。これは期待どおりに機能しません。私が知っている唯一の回避策は、VirtualStoreパスに特にアクセスすることです。 ユーザーがVistaまたは7を実行していて、UACを有効にしている場合...しかし、特にMicrosoftが将来のWindowsバージョンで仮想化の動作を変更することを決定した場合、醜いようです。
解決
MSDNの記事 Windows Vistaのレジストリ仮想化 特定のクラスのプロセスには仮想化が無効になっていると説明しています。
- 64ビットプロセス
- マニフェストで指定されたRequesteDexecutionLevelを持つ実行可能ファイル
- そして他のいくつか。詳細については、記事を確認してください
最初の2つの1つまたは両方は、通常、.NETアプリケーションに当てはまります(コンパイラがサプライされたデフォルトマニフェストのため)。仮想化を有効にするためには、マニフェスト(アプリケーションがレガシーアプリのように見えるように)を削除する必要がありますが、これは悪い考えです(Windowsとの転送性の場合)。代わりに、アプリがVistaで仮想化されていない(および後で)と仮定して、それに応じて続行します。
さらに、この記事では、「Microsoftは、Windowsオペレーティングシステムの将来のバージョンからこの形式の仮想化を削除するつもりであると警告しています。アプリケーションがシステム内の仮想化の存在に大きな依存を依存しないことが不可欠です。」書いたコードは、VirtualStoreキーが将来のバージョンのWindowsに存在しない可能性があることを予測する必要があります。