Как удалить все ключи реестра, не останавливаясь на один не удаляемый ключ? - PullRequest
0 голосов
/ 20 мая 2019

Можно ли удалить все разделы реестра, которые можно удалить, не останавливая ни один не удаляемый ключ с помощью C #?

Когда вы используете GUI редактора реестра для удаления ключей и удаляете дерево подразделов с неразборчивыми ключами внутри (например, ключ используется, недостаточно прав), оно будет пытаться удалить все, что может, без отмены ключей, прерывающих операцию.

Похоже, что это не так с библиотекой Microsoft.Win32 в C #.

Использование внешней программы, такой как reg.exe, работает, но я пытаюсь найти решение, которое не требует внешнего приложения.

private void DelHKLM()
        {
            try
            {
                using (RegistryKey desiredKey = Registry.LocalMachine.OpenSubKey("SOFTWARE", true))
                {
                    desiredKey.DeleteSubKeyTree("Policies");
                }
            }
        }

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

Примечание. Я запускаю программу от имени администратора и у меня есть права доступа к ключу, как показано в редакторе реестра.

Итак, мой вопрос: Есть ли способ добиться того, что делает редактор реестра в C #, предпочтительно с использованием собственных библиотек?

1 Ответ

0 голосов
/ 17 июня 2019

SHDeleteKey у меня работает (проверено на Windows 10) =>

UIntPtr hKey;               
int nStatus = RegOpenKeyEx((UIntPtr)HKEY_LOCAL_MACHINE, @"SOFTWARE", 0, DELETE | KEY_READ | KEY_WRITE | KEY_WOW64_64KEY, out hKey);
if (nStatus == 0)
{
    SHDeleteKey(hKey, @"Policies");
    RegCloseKey(hKey);
}

С объявлениями:

    [DllImport("Advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
    public static extern int RegOpenKeyEx(UIntPtr hKey, string lpSubKey, int ulOptions, int samDesired, out UIntPtr phkResult);

    [DllImport("Advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
    public static extern int RegCloseKey(UIntPtr hKey);

    [DllImport("Shlwapi.dll", SetLastError = true, CharSet = CharSet.Unicode)]
    public static extern int SHDeleteKey(UIntPtr hKey, string pszSubKey);

    public const uint HKEY_LOCAL_MACHINE = 0x80000002;

    public const int READ_CONTROL = 0x00020000;
    public const int SYNCHRONIZE = 0x00100000;

    public const int STANDARD_RIGHTS_READ = READ_CONTROL;
    public const int STANDARD_RIGHTS_WRITE = READ_CONTROL;

    public const int KEY_QUERY_VALUE = 0x0001;
    public const int KEY_SET_VALUE = 0x0002;
    public const int KEY_CREATE_SUB_KEY = 0x0004;
    public const int KEY_ENUMERATE_SUB_KEYS = 0x0008;
    public const int KEY_NOTIFY = 0x0010;
    public const int KEY_CREATE_LINK = 0x0020;
    public const int KEY_READ = ((STANDARD_RIGHTS_READ |
                                                       KEY_QUERY_VALUE |
                                                       KEY_ENUMERATE_SUB_KEYS |
                                                       KEY_NOTIFY)
                                                      &
                                                      (~SYNCHRONIZE));

    public const int KEY_WRITE = ((STANDARD_RIGHTS_WRITE |
                                                       KEY_SET_VALUE |
                                                       KEY_CREATE_SUB_KEY)
                                                      &
                                                      (~SYNCHRONIZE));
    public const int KEY_WOW64_64KEY = 0x0100;
    public const int KEY_WOW64_32KEY = 0x0200;

    public const int DELETE = 0x00010000;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...