Проблема с исключением доступа к реестру - PullRequest
0 голосов
/ 23 августа 2011

В настоящее время я создаю обозреватель реестра, главным образом потому, что я хочу поддерживать некоторые более совершенные операции поиска.Как «найти все» и регулярные выражения.Одна проблема, с которой я сталкиваюсь, заключается в том, что некоторые ключи выдают исключение безопасности при открытии.Я пытался запустить приложение с правами администратора, моя учетная запись пользователя также является администратором.Я встроил манифест с привилегиями "requireAdministrator".Я также попытался установить для параметров безопасности ClickOnce значение «Полное доверие», что несовместимо с requireAdministrator, или, как мне подсказывает Visual Studio .... Ничто не помогает избежать этого исключения.

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

FTR: я нахожусь на Win7 x64 и использую Vs2010u, и проект написан на C # на .net 4.0.Если regedit способен читать все ключи, даже если он не позволяет редактировать некоторые из них.Казалось бы уместно, что мы тоже можем сделать приложение, чтобы сделать то же самое.Хотя я нахожу это очень трудным, и, похоже, никакой реальной помощи на www нет.Только ссылки-кружки, ууу.

[РЕДАКТИРОВАТЬ]

Вот код, который читает ключи:

    private void IterateSubKeys(RegistryKeyModel key) {

        var subKeys = key.Key.GetSubKeyNames();
        var values = key.Key.GetValueNames();

        foreach (var valuename in values) {
            try {
                var valueKind = key.Key.GetValueKind(valuename);
                var value = key.Key.GetValue(valuename);

                key.Values.Add(new RegistryValueModel(valuename, value, valueKind));
            }
            catch { }
        }

        foreach (var keyname in subKeys) {
            try {
                var subkey = key.Key.OpenSubKey(
                    keyname, 
                    RegistryKeyPermissionCheck.ReadSubTree, 
                    RegistryRights.ReadKey);

                key.SubKeys.Add(new RegistryKeyModel(subkey));
            }
            catch { Console.WriteLine("Error reading key: {0}", keyname); }
        }
    }

1 Ответ

2 голосов
/ 23 августа 2011

Это по замыслу.Есть много ключей, связанных с безопасностью, которые доступны только для системной учетной записи.Вы не можете использовать эту учетную запись.Regedit также не может прочитать эти ключи, они просто не видны.Чтобы избежать дорогостоящего исключения, потребуется pinvoke.

...