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



在尝试创建一个检查天气是否存在或不存在密钥的RunonStartup函数时,用户是否希望将其删除,我会遇到拒绝的访问问题。更具体地。

System.UnauthorizedAccessException: 'Cannot write to the registry key.'

我的代码在这里。

private static void RunOnStartup()
    {
        string KeyName = @"HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRun";
        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
            }
        }
    }

我可以创建键,只是不删除它,很奇怪。也许我错过了一份许可,我试图以行政模式运行,但也发生了同样的事情。

代码中的两个错误:

  • 异常UnauthorizedAccessException-'无法写入注册表密钥'表示您未在writable模式下打开RegistryKey。相反,您应该在尝试删除之前以写入模式打开它。确保您将true作为第二个参数,因此:

    RegistryKey reg = Registry.CurrentUser.OpenSubKey("SOFTWARE\..", true);
    reg.DeleteValue("MyApp");
    
  • 最初,您的KeyNameif条件在HKEY_LOCAL_MACHINE中检查,而您的插入/删除后来使用Registry.CurrentUser参考HKEY_CURRENT_USER,因此您可能应该使它们保持一致。

    string KeyName = @"HKEY_CURRENT_USERSOFTWAREMicrosoftWindowsCurrentVersionRun";
    

最新更新