Реестр в .NET: DeleteSubKeyTree говорит, что подраздел не существует, но он есть! - PullRequest
5 голосов
/ 02 июня 2010

Попытка удалить дерево подразделов: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.hdr. .hdr подраздел имеет один подраздел, без значений. Поэтому я использую этот код:

RegistryKey FileExts = Registry.CurrentUser.CreateSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts");
RegistryKey faulty = FileExts.OpenSubKey(".hdr");
Debug.Assert (faulty != null && faulty.SubKeyCount != 0);
faulty.Close();
FileExts.DeleteSubKeyTree(".hdr");

И я получаю ArgumentException с сообщением «Невозможно удалить дерево подразделов, потому что подраздел не существует».

WTF? Я проверил и подтвердил, что он существует?

Обновление статуса

При поиске с помощью Process Monitor подключ ".hdr" получает ошибку ACCESS DENIED при запуске кода. Я проверил авторизации, но они выглядят нормально?

Ответы [ 2 ]

6 голосов
/ 02 июня 2010

Нашел решение, которое поднимает другой вопрос ...

После указания ошибки ACCESS DENIED с помощью Process Monitor я просто попытался удалить подразделы по отдельности:

RegistryKey hdr = FileExts.OpenSubKey(".hdr", true);
foreach (String key in hdr.GetSubKeyNames())
   hdr.DeleteSubKey(key);
hdr.Close();
FileExts.DeleteSubKeyTree(".hdr");

Это работало нормально, так что это не проблема с разрешениями!

По причине, которую я не понимаю, DeleteSubKeyTree требовалось пустое дерево для работы.

Объяснение, кто-нибудь?

0 голосов
/ 02 января 2015

У меня была та же проблема, но другое разрешение. Вызов DeleteSubKeyTree вызвал ArgumentException, заявив, что ключ не существует. Это конечно делает! Я перебираю существующие имена ключей и могу создать RegistryKey.

using (RegistryKey regClasses = Registry.ClassesRoot.OpenSubKey("CLSID", true))
{
    foreach (var class_guid in regClasses.GetSubKeyNames())
    {
        bool should_remove = false;
        using (RegistryKey productKey = regClasses.OpenSubKey(class_guid))
            should_remove = <some code here>
        if (should_remove)
            regClasses.DeleteSubKeyTree(class_guid);
    }
}

Тогда я понял, что отлаживаю в режиме пользователя. Когда я работал в качестве администратора, он работал нормально. Странно, что первый OpenSubKey работает в пользовательском режиме, но когда я открываю подразделы ниже этого, я правильно получаю Отказ в доступе в пользовательском режиме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...