从昨晚开始,我尝试搜索可以帮助我删除注册表值的解决方案,该值与我的输入字符串值相匹配。例如"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。 如何使用上面的代码跳过安全项并继续下一个?再次感谢你的时间。