Registry.GetValue всегда возвращает ноль - PullRequest
17 голосов
/ 29 февраля 2012

В моем реестре есть следующий ключ:

under: 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 значение всегда равно нулю.

enter image description here

Есть идеи?

Ответы [ 6 ]

44 голосов
/ 02 ноября 2014

Правило из Джейсон верно, проблема заключается в операционной системе, приведенный ниже код поможет вам решить.

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();
19 голосов
/ 29 февраля 2012

Вы не получаете доступ к кусту 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());
        }

Обновление:

Если он возвращает ноль, установите архитектуру сборки на Любой ЦП . Операционная система может по-разному виртуализировать 32-битные и 64-битные реестры. См .: http://msdn.microsoft.com/en-us/library/windows/desktop/aa965884%28v=vs.85%29.aspx, Чтение 64-битного реестра из 32-битного приложения и http://msdn.microsoft.com/en-us/library/windows/desktop/ms724072%28v=vs.85%29.aspx.

3 голосов
/ 09 февраля 2015

, если вы используете 64-битную операционную систему, когда вы пытаетесь получить HKEY_LOCAL_MACHINE\SOFTWARE\RSA это на самом деле ищет HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\RSA вот почему вы получаете ноль

1 голос
/ 20 августа 2013

У меня было лишнее "\" в начале моего пути, убедитесь, что оно установлено правильно.

1 голос
/ 29 февраля 2012

посмотрите разрешения безопасности для раздела реестра с помощью regedt32.exe;проверьте, что вы работаете от имени администратора и отключили UAC.В соответствии с документацией opensubkey его необходимо открыть перед тем, как получить доступ к любым ключам;http://msdn.microsoft.com/en-us/library/z9f66s0a.aspx

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

Ни одно из решений здесь не сработало для меня, я все еще получал нулевое значение из моего реестра.Я наконец нашел решение, которое сработало для меня, основанное на объединении ответов выше.Спасибо всем за указание в правильном направлении.

Я ценю, что я опаздываю на вечеринку, но я подумал, что это может помочь другим, если вышеуказанные решения не работают для них.

Эта функция является частью класса:

/// <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();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...