[英]Reading registry keys from c#
我正在尝试获取当前安装的Office即点即用的一些数据。
我已阅读以下文章: 无法读取注册表项或OpenSubKey()对于regedit.exe中可以看到的注册表项返回null
我在Windows 10 64位上。 我的应用程序是Outlook加载项,因此我无法更改目标平台(32/64位),它是由主机确定我运行的是32位还是64位。 因此,我必须处理两种情况。
所以我有这个(测试)代码:
using (var hklmTest64 = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64))
{
var test = hklmTest64.GetValue(@"SOFTWARE\Microsoft\Office\ClickToRun\Configuration\AudienceData");
if (test == null)
{
using (var hklmTest32 = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32))
{
test = hklmTest32.GetValue(@"SOFTWARE\Microsoft\Office\ClickToRun\Configuration\AudienceData");
}
}
}
因此,我首先使用64位视图获取注册表项,然后如果为null,则使用32位视图重试。
问题:测试始终为NULL
。
当然密钥存在,我可以使用regedit看到它:
当然,我首先尝试了直到现在一直对我有用的简单代码,但无法获取此密钥:
test = Registry.LocalMachine.GetValue(@"SOFTWARE\Microsoft\Office\ClickToRun\Configuration\AudienceData");
test = Registry.GetValue(@"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\Configuration", "AudienceData", null);
更奇怪的是,我在获取Windows内部版本号时遇到了完全相同的问题。 该代码不起作用:
var wBuild = Registry.LocalMachine.GetValue(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion\ReleaseId");
但这对于Windows构建非常适用(不适用于Outlook键):
var wBuild = Registry.GetValue(@"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion", "ReleaseId", null);
任何想法如何获取此注册表项?
更新1
请参阅C#获取Office ClickToRun注册表项返回null的帖子,但阅读该帖子,我使用RegistryView.RegistryXX
代码应该可以工作...
更新2
我已经使用LinqPad重现了该问题,所以这不是由于Outlook主机/加载项。 我试图在.NET Fiddle中进行复制,但实际上代码不允许访问注册表:)
我可以用P中的正确值/调用像解释在这篇文章中 。 因此对我来说,这显然是一个32/64位(wow6432node)问题。
你不需要
RegistryKey.OpenBaseKey
只需使用Registry.GetValue(keyName, valueName, defualt value)
这是工作的例子
string InstallPath = (string)Registry.GetValue(@"HKEY_LOCAL_MACHINE\\SOFTWARE\\" + path, "ActivationCode", null);
我可以使用P / Invoke获得正确的值,如本文所述。 因此对我来说,这显然是一个32/64位(wow6432node)问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.