Чтение ключей реестра из c # - PullRequest
0 голосов
/ 01 мая 2018

Я пытаюсь извлечь некоторые данные из установленного в настоящий момент Office Click-To-Run.

Я прочитал эти сообщения: Не могу прочитать ключ реестра или OpenSubKey () возвращает значение NULL для ключа реестра, который я вижу в 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 (не для ключа Outlook):

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

Есть идеи, как получить этот раздел реестра?

ОБНОВЛЕНИЕ 1

См. Сообщение C # get Office. Ключ реестра Office ClickToRun возвращает ноль Но, читая пост, мой код, использующий RegistryView.RegistryXX, должен работать ...

ОБНОВЛЕНИЕ 2

Я воспроизвел проблему с помощью LinqPad, так что это не связано с хостом / надстройкой Outlook. Я попытался перепродать в .NET Fiddle, но на самом деле код не имеет доступа к реестру:)

Я могу получить правильные значения, используя P / Invoke, как объяснено в этой статье . Так что для меня это явно проблема 32 / 64bit (wow6432node).

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Я могу получить правильные значения, используя P / Invoke, как описано в этой статье. Так что для меня это явно проблема 32 / 64bit (wow6432node).

0 голосов
/ 01 мая 2018

вам не нужно

RegistryKey.OpenBaseKey

просто используйте Registry.GetValue(keyName, valueName, defualt value)

это рабочий пример

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

...