0

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

一开始,如果我只是指定item "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"(只是显示/读取)的注册表值时。它报告了一些异常。

主要代码:

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}”,尽管不是 UnauthorizedAccessException,但它仍然报告为“SecurityException”。如何跳过安全项并使用上面的代码继续下一个?再次感谢您的时间。

4

0 回答 0