C#中如何正确使用注册表权限删除注册表子项?

How Can I Correctly Use Registry Permissions to Delete a Registry Subkey in C#?

在 Windows 注册表中,我有子项 \HKEY_CURRENT_USER\HTMPTK,它有两个值:Secret TokenToken。我想删除这两个值。

我试图使用 key.DeleteValue("Secret Token")key 是一个 RegistryKey 变量),但我得到了一个 UnauthorizedAccessException,消息是 无法写入到注册表项.

修改 MSDN 和 Google,以允许程序访问它需要的权限,我找到了 RegistryPermission class,以及一些示例作为指导。因此,我写了下面的代码:

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 Defender 没有发出任何可疑信号;
  3. 如果有帮助,我可以从注册表编辑器中删除这些值;

原因是因为我使用了错误的 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;
        }