11

次のように、レジストリ サブキーとそれに対応する値をレジストリに書き込もうとしました。

const string subKey = @"SOFTWARE\Apple\Banana\";
const string regKey = "pip";

var rk = Registry.LocalMachine.OpenSubKey(subKey);
if (rk == null)
    rk = Registry.LocalMachine.CreateSubKey(subKey);

var rv = rk.GetValue(regKey);
if (rv == null)
    rk.SetValue(regKey, "XXX");

return rv.ToString();

ここでの問題は、(regedit を介して) 手動で場所を調べたときに、 のフォルダーが表示されないことSOFTWARE\Apple\BananaですHKLM

Registry.LocalMachine.OpenSubKey(subKey)しかし、上記のコードを再度実行してデバッグすると、両方ともrk.GetValue(regKey)保存前の値が生成されることがわかります。それでも、regeditを介して指定された場所に値が表示されません。したがって、レジストリを検索すると、次の場所に上記のキーと値が表示されます。

  1. HKEY_CURRENT_USER\Software\Classes\VirtualStore\MACHINE\SOFTWARE\Apple\Banana

  2. HKEY_USERS\S-1-5-21-44266131-1313801407-2392705078-1000\Software\Classes\VirtualStore\MACHINE\SOFTWARE\Apple\Banana

どちらの下でも、値は保存したとおりのままです。だから私はこれが私のアプリが値を読み取る場所からであることを理解していますが、私のコードではそれを呼び出しHKLM\SOFTWARE\Apple\Banana\ます..

  1. なぜこうなった?アクセス権の問題に関連していますか?

  2. これは予想される動作ですか?ある意味で、この値は私にとって非常に重要なので、自動再配置に関連するリスクがあるかどうかを知っているだけです!

  3. 正確な場所に残るようにレジストリに書き込む適切な方法はありますか..

私のアカウントは管理者 1 で、32 ビットの Windows 7 を使用しています。

編集:私が知ったように、レジストリエントリはHKLMではなく現在のユーザーの場所に保存されています。また、別のアカウントから reg 値を照会すると、値が取得されません。要するに、まずHKLMに保存しても意味がありません:(

4

2 に答える 2

6

はい、これは正しい動作であり、HKLM ハイブに直接書き込むための十分な権限がないために発生しています。これは仮想化と呼ばれ、ファイル システムでも発生します。これは、Vista 以降の OS の動作です。

そのまま続行し、書き込み先と同じ HKLM キーからの読み取りも試行する必要があります。Windows は透過的にリダイレクトします。

Preet が親切にも MSDN リンクを提供してくれました。よく読んでください。

HKLM でキーにアクセスする場合は、管理者として実行している場合でも、必要なアクセス許可も含める必要があることに注意してください (キーは管理者権限で自動的に開かれないため、要求する必要があります)。

key = key.OpenSubKey(keyname, RegistryKeyPermissionCheck.ReadWriteSubTree, RegistryRights.FullControl);
于 2012-06-07T23:44:33.187 に答える
5
  1. これはレジストリ仮想化 (msdn) です。

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

    仮想化の概要

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

  2. はい、まさにその通りです。

  3. グローバルに影響を与える場所に書き込みたい場合は仮想化を使用するか、それが必要ない場合はよりローカライズされた場所を使用します。いずれにせよ、それは読者には見えないので、心配する必要はありません。

于 2012-06-07T23:44:29.050 に答える