web-dev-qa-db-ja.com

Registry.LocalMachine.OpenSubKey()がnullを返す

このWindowsレジストリへのアクセス試行から、nullが返されます。

using (RegistryKey registry = Registry.LocalMachine.OpenSubKey(keyPath))

keyPathはSOFTWARE\\TestKey

キーはレジストリにあるので、なぜローカルコンピュータハイブの下に見つからないのですか?

29
PositiveGuy

Danaへのコメントで、ASP.NETアカウントにアクセス権を与えたと述べました。しかし、サイトが実行されているアカウントであることを確認しましたか?偽装と匿名アクセスのユーザーは見落としがちです。

テストされていないコード:

Response.Clear();  
Response.Write(Environment.UserDomainName + "\\" + Environment.UserName);  
Response.End();
2
KellCOMnet

64ビットマシンを使用している場合に発生する可能性があります。最初にヘルパークラスを作成します(.NET 4.0以降が必要です):

public class RegistryHelpers
{

    public static RegistryKey GetRegistryKey()
    {
        return GetRegistryKey(null);
    }

    public static RegistryKey GetRegistryKey(string keyPath)
    {
        RegistryKey localMachineRegistry
            = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine,
                                      Environment.Is64BitOperatingSystem
                                          ? RegistryView.Registry64
                                          : RegistryView.Registry32);

        return string.IsNullOrEmpty(keyPath)
            ? localMachineRegistry
            : localMachineRegistry.OpenSubKey(keyPath);
    }

    public static object GetRegistryValue(string keyPath, string keyName)
    {
        RegistryKey registry = GetRegistryKey(keyPath);
        return registry.GetValue(keyName);
    }
}

使用法:

string keyPath = @"SOFTWARE\MyApp\Settings";
string keyName = "MyAppConnectionStringKey";

object connectionString = RegistryHelpers.GetRegistryValue(keyPath, keyName);

Console.WriteLine(connectionString);
Console.ReadLine();
58
Raghav

それを変更するだけです

using (RegistryKey registry = Registry.LocalMachine.OpenSubKey(keyPath))

using (RegistryKey registry = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Default).OpenSubKey(keyPath))

RegistryKeyの代わりにRegistryを使用し、RegistryViewを追加して、Hive-Local Machineをメソッドパラメーターとして配置します。)

0
vapcguy