Registry.LocalMachine.OpenSubKey()返回null

Pos*_*Guy 29 c# registry

我从这次访问Windows注册表的尝试中获得了null:

using (RegistryKey registry = Registry.LocalMachine.OpenSubKey(keyPath))
Run Code Online (Sandbox Code Playgroud)

keyPath是 SOFTWARE\\TestKey

关键是在注册表中,为什么它不在Local Machine配置单元下找到它?

Rag*_*hav 58

如果您使用的是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);
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

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

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

Console.WriteLine(connectionString);
Console.ReadLine();
Run Code Online (Sandbox Code Playgroud)

  • 应该注意,这个答案需要.NET 4.0或更高版本. (9认同)
  • 在64位Windows上有两个regedit实用程序.C:\ Windows\System32\regedt32.exe和C:\ Windows\SysWOW64\regedt32.exe.每个人都给你一个不同的RegistryView (4认同)
  • 不需要64位检查.从MSDN:`如果在32位操作系统上请求64位视图,返回的键将在32位视图中. (3认同)
  • 在.NET 3.5中有没有办法做到这一点? (2认同)

Kel*_*net 2

在您对 Dana 的评论中,您说您授予了 ASP.NET 帐户访问权限。但是,您是否验证过该帐户是该网站运行的帐户?模拟和匿名访问用户很容易被忽视。

未经测试的代码:

Response.Clear();  
Response.Write(Environment.UserDomainName + "\\" + Environment.UserName);  
Response.End();
Run Code Online (Sandbox Code Playgroud)