web-dev-qa-db-ja.com

Registry.GetValueは常にnullを返します

レジストリに次のキーがあります。

下:HKEY_LOCAL_MACHINE\SOFTWARE\RSA値オブジェクトの呼び出し-WebExControlManagerPathがあり、その値はc:\

私はこれをやろうとしています:

var r = Registry.GetValue(@"HKEY_LOCAL_MACHINE\SOFTWARE\RSA", "WebExControlManagerPth",null);

if(r!=null)
    ProcessAsUser.Launch(ToString());

ただし、rの値は常にnullです。

enter image description here

何か案は?

19
MoShe

HKEY_LOCAL_MACHINE Hiveには、バッチスクリプトの場合と同じようにC#で行う方法とは異なります。あなたが呼ぶ Registry.LocalMachine、 など:

        RegistryKey myKey = Registry.LocalMachine.OpenSubKey( @"Software\RSA", false);
        String value = (String)myKey.GetValue("WebExControlManagerPth");

        if (!String.IsNullOrEmpty(value))
        {
            ProcessAsUser.Launch(ToString());
        }

更新:

Nullを返す場合は、ビルドアーキテクチャをAny CPUに設定します。オペレーティングシステムによって、32ビットレジストリと64ビットレジストリの仮想化が異なる場合があります。参照: http://msdn.Microsoft.com/en-us/library/windows/desktop/aa965884%28v=vs.85%29.aspxReading 64bit Registry from a 32ビットアプリケーション 、および http://msdn.Microsoft.com/en-us/library/windows/desktop/ms724072%28v=vs.85%29.aspx

19
Jason

ステートメントジェイソン が正しい、オペレーティングシステムに問題がある、以下のコードが解決に役立ちます。

RegistryKey localKey;
if(Environment.Is64BitOperatingSystem)
    localKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
else
    localKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32);

string value = localKey.OpenSubKey("RSA").GetValue("WebExControlManagerPth").ToString();
44
Palanikumar

64ビットのオペレーティングシステムを使用している場合、HKEY_LOCAL_MACHINE\SOFTWARE\RSA実際に探しているのはHKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\RSAそれがnullを取得する理由です

3
Ahinoam Mazuz

パスの先頭に余分な「\」がありましたが、正しく設定されていることを確認してください。

1
Zeus

regedt32.exeを使用してレジストリキーのセキュリティ権限を確認します。管理者として実行しており、UACがオフになっているかどうかを確認してください。 opensubkeyのドキュメントによると、キーにアクセスする前にまず開く必要があります。 http://msdn.Microsoft.com/en-us/library/z9f66s0a.aspx

1
Ricky G

ここでの解決策はどれもうまくいきませんでした。レジストリの読み取りからnullが返されていました。上記の回答の融合に基づいて、ようやく私に役立つ解決策を見つけました。正しい方向に向けてくれてありがとう。

私はパーティーに遅れたことを感謝しますが、上記の解決策が彼らのために機能しない場合、これは他の人を助けるかもしれないと思いました。

この関数はクラスの一部です:

/// <summary>
/// Gets the specified setting name.
/// </summary>
/// <param name="settingName">Name of the setting.</param>
/// <returns>Returns Setting if the read was successful otherwise, "undefined".</returns>
public static string get(string settingName)
{
    RegistryKey key;

    if (Environment.Is64BitOperatingSystem)
        key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Wow6432Node\MyCompany\MyProductName", false);
    else
        key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\MyCompany\MyProductName", false);

    try
    {
        String value = (String)key.GetValue(settingName);

        return value;
    }
    catch
    {
        // Null is not returned as in this case, it is a valid value.

        return "undefined";
    }
    finally
    {
        key.Close();
    }
}
0
Ken Haynes