C # получение статуса SystemRestore из реестра - PullRequest
2 голосов
/ 24 декабря 2011

Я пытаюсь прочитать раздел реестра «RPSessionInterval» из подраздела «HKLM \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ SystemRestore» в C #.Я использую следующий код и получаю исключение «Ссылка на объект не установлена ​​для экземпляра объекта».

string systemRestore = @"SOFTWARE\Microsoft\Windows NT\CurrentVersion\SystemRestore";
RegistryKey baseRegistryKey = Registry.LocalMachine;
public string SystemRestoreStatus(string subKey, string keyName)
{
    RegistryKey rkSubKey = baseRegistryKey.OpenSubKey(systemRestore);
    if (rkSubKey != null)
    {
        try
        {
            string sysRestore = rkSubKey.GetValue("RPSessionInterval").ToString();
            if (string.Compare(sysRestore, "1") == 0)
            {
                MessageBox.Show("System Restore is Enabled!");
                return "System Restore is Enabled!";
            }
            else if (string.Compare(sysRestore, "0") == 0)
            {
                MessageBox.Show("System Restore is Disabled!");
                return "System Restore is Disabled!";
            }
            else
            {
                return null;
            }
        }
        catch (Exception ex)   //This exception is thrown
        {
            MessageBox.Show("Error while reading registry key: " + subKey + "\\" + keyName + ". ErrorMessage: " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            return null;
        }
    }
    else
    {
        MessageBox.Show("Error while reading registry key: " + subKey + "\\" + keyName + " does not exist!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        return null;
    }
}

Вот изображение, показывающее, что раздел реестра действительно существует:

image

Ответы [ 2 ]

4 голосов
/ 24 декабря 2011

Скорее всего, у вас есть проблема правописания для вызова SystemRestoreStatus, что вызывает исключение в следующей строке:

string sysRestore = rkSubKey.GetValue(keyName).ToString();

Если вы не уверены, существует ли значение или нет, вы можете изменить эту строку на:

string sysRestore = rkSubKey.GetValue(keyName) as string;

и затем проверьте, является ли строка нулевой или пустой, прежде чем пытаться ее использовать.

Обновление

Другая возможность заключается в том, что вы выполняете код из 32-разрядного приложения в 64-разрядной ОС. В этом случае .Net услужливо перенаправляет ваш запрос на

SOFTWARE\Wow6432Node\Microsoft\...

узел вместо.

Вы можете обойти эту проблему, используя RegistryKey.OpenBaseKey , используя RegistryView.Registry64 в качестве второго параметра.

3 голосов
/ 24 декабря 2011

Возможно, у вас неправильная битность для вашего приложения на C #. По умолчанию проект Visual Studio 2010 C # будет компилироваться в x86 (32-разрядную версию) . 32-разрядное приложение, работающее в 64-разрядной ОС, обычно может обращаться только к 32-разрядному реестру, , содержимое которого часто отличается от собственного 64-разрядного реестра . Измените архитектуру на «Любой ЦП» или «x64» , и это может работать.

...