Как правильно использовать разрешения реестра для удаления подраздела реестра в C #? - PullRequest
0 голосов
/ 31 мая 2019

В реестре Windows у меня есть подраздел \HKEY_CURRENT_USER\HTMPTK, который имеет два значения: Secret Token и Token.Я хочу удалить два значения.

Я попытался использовать key.DeleteValue("Secret Token") (key - это переменная RegistryKey), но я получил UnauthorizedAccessException с сообщением Невозможно записать в раздел реестра .

Работая с MSDN и Google, чтобы предоставить программе необходимый доступ, я нашел класс RegistryPermission вместе с некоторыми примерами в качестве руководства.Таким образом, я написал следующий код:

private bool DeleteTokensFromRegistryEngine()
        {
            RegistryPermission perm = new RegistryPermission(PermissionState.Unrestricted);
            perm.AddPathList(RegistryPermissionAccess.AllAccess, "HKEY_CURRENT_USER\\HTMPTK");
            RegistryKey key = Registry.CurrentUser.OpenSubKey("HTMPTK");
            try
            {
                if (key != null)
                {
                    key.DeleteValue("Secret Token"); //the same error message here
                    key.DeleteValue("Token");
                }
            }
            catch (UnauthorizedAccessException U)
            {
                MessageBox.Show(U.Message);
                return false;
            }
            finally
            {
                key.Close();
            }
            return true;
        }

Проблема не исчезла.

Что я делаю не так?Как я могу решить эту проблему?

Позже отредактируйте :

  1. Я дважды проверил, запускаю ли я программу от имени Администратора.Я делаю;
  2. Ничего подозрительного не сигнализирует Защитник Windows;
  3. Если это поможет, я могу удалить значения из редактора реестра;

1 Ответ

0 голосов
/ 31 мая 2019

Причина была в том, что я использовал неправильный OpenSubKey ctor. Правильный был:

OpenSubKey(String, RegistryRights)

В моем случае подключ должен был быть открыт с помощью:

RegistryKey key = Registry.CurrentUser.OpenSubKey("HTMPTK",RegistryKeyPermissionCheck.ReadWriteSubtree);

Однако есть лучший способ: поскольку я хочу удалить оба значения, проще удалить весь подраздел. Я применил этот метод, и полученный код был:

        try
        {
            Registry.CurrentUser.DeleteSubKeyTree("HTMPTK", true);                
        }
        catch (UnauthorizedAccessException U)
        {
            MessageBox.Show(U.Message);
            return false;
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...