从c#中读取注册表项

时间:2018-05-01 11:20:57

标签: c# outlook registry outlook-addin

我试图在当前安装的Office即点即用中获取一些数据。

我已阅读这些帖子:Can't Read Registry KeyOpenSubKey() returns null for a registry key that I can see in regedit.exe
我在Windows 10 64bit上。我的应用程序是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看到它:

Registry Key visible with 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 build(不适用于outlook键):

var wBuild = Registry.GetValue(@"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion", "ReleaseId", null);

知道如何获取此注册表项吗?

更新1

查看帖子C# get Office ClickToRun Registry Key returns null 但阅读帖子后,我的代码使用RegistryView.RegistryXX应该有效......

更新2

我使用LinqPad重新解决了这个问题,所以这不是由于Outlook主机/加载项造成的。我试图在.NET Fiddle中重新编写,但实际上代码不允许访问注册表:)

我可以使用P / Invoke获取正确的值,如解释in this article。所以对我而言,这显然是一个32 / 64bit(wow6432node)问题。

2 个答案:

答案 0 :(得分:0)

你不需要

RegistryKey.OpenBaseKey

只需使用Registry.GetValue(keyName, valueName, defualt value)

这是工作示例

string InstallPath = (string)Registry.GetValue(@"HKEY_LOCAL_MACHINE\SOFTWARE\" + path, "ActivationCode", null);

答案 1 :(得分:0)

我可以使用P / Invoke获得正确的值,如本文所述。所以对我来说,这显然是一个32/64位(wow6432node)问题。