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

时间:2019-05-31 09:09:53

标签: c# registry registrykey

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

我尝试使用key.DeleteValue("Secret Token")keyRegistryKey变量),但是却收到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 Defender未发出任何可疑信号;
  3. 如果有帮助,我可以从注册表编辑器中删除这些值;

1 个答案:

答案 0 :(得分:0)

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

为什么我必须使用Registry.CurrentUser.DeleteSubKeyTree("HTMPTK", true);而不是key.CurrentUser.DeleteSubKeyTree("HTMPTK", true);是个谜。