删除/读取注册表值时发生UnauthorizedAccessException

时间:2013-09-28 18:12:59

标签: registry

从昨晚开始,我尝试搜索可以帮助我删除注册表值的解决方案,该值与我的输入字符串值相匹配。例如"C:\Program Files\ArcGIS"。也就是说,如果注册表值以"C:" and contains "ArcGIS"开头,我将删除注册表值。

首先,如果我刚刚指定了项目"HKEY_CURRENT_USER\Software\ESRI",我会流畅地删除这种值,但如果没有"ESRI"子项,我必须使用"Software"进行扫描。

我搜索了一整天的解决方案,但徒劳无功。

通过创建"app.manifest"内容并更改level="requireAdministrator",我尝试过以管理员身份运行的内容。此外,大多数人只是说“使用方法.OpenSubKey(s,true)优于.OpenSubKey(s)”,同样的说法“.DeleteValue(v,false)优于.DeleteValue(v)”。

10个主题中的7个刚刚发布了一些删除注册表值的简单方法,如DeleteValue(v,false)

所以我认为我只是有权阅读不首先修改或设置值。 但是当我要显示关于"ArcGIS"(Just Show / Read)的所有注册表值时。它报告了一些例外。

主要是代码:

private void MainForm_Load(object sender, EventArgs e) {
        RecursiveRegedit(Microsoft.Win32.Registry.CurrentUser);
        RecursiveRegedit(Microsoft.Win32.Registry.LocalMachine);
    }
    //Recursive scan the registry.
    void RecursiveRegedit(Microsoft.Win32.RegistryKey regBoot) {
        if(regBoot == null) throw new ArgumentNullException("Null Item!");
        string[] vals = regBoot.GetValueNames();
        foreach(var v in vals) {
            string s = regBoot.GetValue(v).ToString();
            if(s.StartsWith("C:", StringComparison.CurrentCultureIgnoreCase))
                _RKeys.Add(regBoot);    //Add to 'List'.
        }
        if(regBoot.SubKeyCount <= 0)    //Exit.
            return;
        else {  //Recursive.
            string[] subs = regBoot.GetSubKeyNames();
            foreach(string s in subs) {
                RecursiveRegedit(regBoot.OpenSubKey(s, Microsoft.Win32.RegistryKeyPermissionCheck.ReadSubTree, System.Security.AccessControl.RegistryRights.ChangePermissions));
                //RecursiveRegedit(regBoot.OpenSubKey(s,true));
            }
        }
        regBoot.Close();    //Close.
    }

除了我的问题,当我将代码更改为“RegistryRights.FullControl”。我甚至右键单击“HKEY_LOCAL_MACHINE”并添加管理员,并取消注释代码“supportedOS Id =”{35138b9a-5d96-4fbd -8e2d-a2440225f93a}“,它仍然报告为”SecurityException“,但不是UnauthorizedAccessException。 如何使用上面的代码跳过安全项并继续下一个?再次感谢你的时间。

0 个答案:

没有答案