C# Поиск в реестре, обратный обход результатов

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

ЭТО РЕЕСТР WINDOWS 7. НЕ ТЕЛЕФОН Вот шаги, которым я пытаюсь следовать

До сих пор я написал код, который найдет все экземпляры записей реестра устройств, содержащих «ZuneDriver».

RegistryKey start = Registry.LocalMachine;
    using (RegistryKey root = start.OpenSubKey(@"SYSTEM\CurrentControlSet\Enum\USB"))
    {
        string myKey = "ZuneDriver";
        SearchSubKeys(root, myKey);

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

На данный момент результаты поиска хранятся в:

    static System.Collections.Specialized.StringCollection log = new System.Collections.Specialized.StringCollection();

по моей функции поиска:

public static void SearchSubKeys(RegistryKey root, String searchKey)
{
    foreach (string keyname in root.GetSubKeyNames())
    {
        try
        {
            using (RegistryKey key = root.OpenSubKey(keyname))
            {
                if (keyname == searchKey)
                {
                    log.Add(key.Name);
                }


                SearchSubKeys(key, searchKey);
            }
        }
        catch (System.Security.SecurityException)
        {
        }
    }
}

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

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\VID_045E&PID_04EC&MI_00\7&b85dba6&0&0000\Параметры устройства\ZuneDriver

Я хотел бы, чтобы моя программа имела доступ к реестру:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\VID_045E&PID_04EC&MI_00\7&b85dba6&0&0000\Параметры устройства

для редактирования значения DWORD под названием «ShowInShell»

но он должен определить \VID_045E&PID_04EC&MI_00\7&b85dba6&0&0000\ через первоначальный поиск.....

Любые указатели или предложения высоко ценятся :)

Ваше здоровье,

Бен


person Community    schedule 19.02.2012    source источник
comment
Это должно быть кроличья нора. Вы, конечно, не можете получить доступ для записи к этому ключу. Даже если бы вы это сделали, это все равно не сработало бы, поскольку драйвер понятия не имеет, что один из его параметров был просто взломан без перезагрузки телефона.   -  person Hans Passant    schedule 19.02.2012
comment
Исходный пост отредактировал. Это реестр Windows, а не телефона. Это просто сделать с помощью regedit. Я просто пытаюсь создать код для автоматизации процесса :)   -  person    schedule 19.02.2012
comment
возможный дубликат Как заставить Приложение C# для запуска от имени администратора в Windows 7   -  person Hans Passant    schedule 19.02.2012
comment
Я не беспокоюсь о доступе прямо сейчас, я просто спрашиваю, как, найдя ключ реестра «ZuneDriver», я могу открыть над ним «Параметры устройства» :)   -  person    schedule 19.02.2012
comment
Но спасибо за предоставленную ссылку, она помогла с чем-то еще, над чем я работал!   -  person    schedule 19.02.2012


Ответы (1)


Я бы сделал это так:

public static void SearchSubKeys(RegistryKey root, String searchKey)
{
    bool containsKey = false;
    foreach (string keyname in root.GetSubKeyNames())
    {
        try
        {
            using (RegistryKey key = root.OpenSubKey(keyname))
            {
                if (keyname == searchKey)
                {
                    containsKey = true;
                }

                SearchSubKeys(key, searchKey);
            }
        }
        catch (System.Security.SecurityException)
        {
        }
    }
    if(containsKey){
        using (RegistryKey key = root.CreateSubKey("Device Parameters"))
        {
            key.SetValue("ShowInShell", /* your value */, RegistryValueKind.DWord);
        }
    }
}
person Rasmus Faber    schedule 19.02.2012
comment
Спасибо за это, теперь я получаю исключение nullReferenceException для key.SetValue(). - person ; 19.02.2012
comment
@Ben Roeves: попробуйте CreateSubKey вместо OpenSubKey. В противном случае дайте мне знать, что говорит трассировка стека. - person Rasmus Faber; 19.02.2012
comment
Извините, я не уверен, что такое stacktrace... вот ссылка на код с предложенными вами изменениями ссылка на кодовую панель - person ; 22.02.2012
comment
@Ben Roeves: когда вы получаете исключение, оно будет сопровождаться трассировкой стека, объясняющей, где возникла проблема. Это будет несколько строк, каждая из которых начинается с at. т.е. в Microsoft.Win32.RegistryKey.EnsureWriteable(). Связанный код не использует CreateSubKey() — это ошибка? OpenSubKey() вернет null, если у вас нет разрешения на открытие ключа, поэтому я думаю, что это и происходит. - person Rasmus Faber; 22.02.2012