我的注册表中有以下密钥:
下: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
值始终为空。
有什么想法吗?
答案 0 :(得分:42)
statement的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();
答案 1 :(得分:19)
您不像在批处理脚本中那样访问HKEY_LOCAL_MACHINE配置单元,就像在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.aspx,Reading 64bit Registry from a 32bit application和http://msdn.microsoft.com/en-us/library/windows/desktop/ms724072%28v=vs.85%29.aspx。
答案 2 :(得分:3)
如果您使用的是64位操作系统,那么当您尝试获取时
HKEY_LOCAL_MACHINE\SOFTWARE\RSA
它实际上在寻找HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\RSA
这就是为什么你得到null
答案 3 :(得分:1)
使用regedt32.exe查看注册表项的安全权限;检查您是否以管理员身份运行并关闭了UAC。根据opensubkey文档,在访问任何密钥之前需要先打开它; http://msdn.microsoft.com/en-us/library/z9f66s0a.aspx
答案 4 :(得分:1)
我在路径的开头有额外的“\”,确保设置正确。
答案 5 :(得分:0)
这里没有一个解决方案对我有用,我仍然从读取的注册表中返回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();
}
}
答案 6 :(得分:0)
根据 Palanikumar 上面的评论(抱歉,我还没有足够的代表对他的帖子发表评论!),但我在构建选项中取消了“首选 32 位”,这解决了我的问题。当我读取注册表值时(在 32 位注册表配置单元中),当它被设置为 0 时,它总是作为特定 DWORD 值的 1 返回!把我推到墙上想办法解决这个问题,尝试重新启动,更改密钥,但在我取消选中此框之前没有任何修复。现在得到正确的 0 值!太棒了!
string keyValue = key.GetValue("ChangeMeToKeyName").ToString();
if (keyValue == "0")
{
//DoThings
}