C# 拒绝访问删除注册表值

ImN*_*tic 1 c# registry

当尝试创建一个 RunOnStartup 函数来检查天气或密钥是否存在以及如果存在,用户是否希望将其删除时,我遇到了访问被拒绝的问题。更具体地说是这个。

System.UnauthorizedAccessException: 'Cannot write to the registry key.'
Run Code Online (Sandbox Code Playgroud)

我的代码在这里。

private static void RunOnStartup()
    {
        string KeyName = @"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run";
        string valueName = "MyApp";
        if (Registry.GetValue(KeyName, valueName, null) == null)
        {
            RegistryKey reg = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);
            reg.SetValue("MyApp", Application.ExecutablePath.ToString());
            MessageBox.Show("The Program will now start on startup", "Startup");
        }
        else
        {
            DialogResult dialogResult = MessageBox.Show("This Program can already run on Start up. Do you want it to no longer do so?", "Start Up", MessageBoxButtons.YesNoCancel);
            if(dialogResult == DialogResult.Yes)
            {
                Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run").DeleteValue("MyApp");
            }
            else if(dialogResult == DialogResult.No)
            {
                MessageBox.Show("The Program will continue to run on Startup", "Startup", MessageBoxButtons.OK);
            }
            else if(dialogResult == DialogResult.Cancel)
            {
                //Do Nothing
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

我可以创建密钥,只是不能删除它,很奇怪。也许我缺少一个权限,我尝试以管理模式运行,但发生了同样的事情。

deg*_*ant 5

您的代码中有两个错误:

  • 异常UnauthorizedAccessException- “无法写入注册表项”表示您没有打开RegistryKeyinwritable模式。相反,您应该在尝试删除之前以写入模式打开它。确保您true作为第二个参数传递,如下所示:

    RegistryKey reg = Registry.CurrentUser.OpenSubKey("SOFTWARE\\..", true);
    reg.DeleteValue("MyApp");
    
    Run Code Online (Sandbox Code Playgroud)
  • 另外,最初您的KeyNameif条件会检查HKEY_LOCAL_MACHINE,而您的插入/删除稍后会提到HKEY_CURRENT_USER使用Registry.CurrentUser,因此您应该使它们保持一致。

    string KeyName = @"HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run";
    
    Run Code Online (Sandbox Code Playgroud)