递归遍历删除注册表项和键值
操作注册表有风险,需谨慎。
在使用以下代码删除注册表项和键值前,请先备份对应的注册表数据。
使用以下代码前提要有当前用户操作注册表的读写权限。
执行以下代码能删除大部分数据,但可能并不完全删除想要删除的数据(有些是权限限制,有些要手动去注册表删除),只是给出一个递归遍历注册表的思路,请按需自行更改代码,但请慎重。
最保险安全的做法是,在虚拟机上测试
using Microsoft.Win32; using System; namespace 查找删除注册表 { class Program { static int keyValueCount; //统计无权限(删除)键值个数 static int subKeyUnPermissionsCount; //统计无权限(访问或删除)子项个数 static int otherSubKeyUnPermissionsCount; //其他无权限(访问)子项个数(其他无权限的子项可能包含有我们要删除的内容) static string keyword = "VMware"; //自定义要删除含此字符串的子项和键值 static void Main(string[] args) { //遍历CurrentUser表 RegistryKey currentUser = Registry.CurrentUser; RegeditRecursion(currentUser); ConsoleOutput("CurrentUser"); //遍历ClassesRoot表 RegistryKey classesRoot = Registry.ClassesRoot; RegeditRecursion(classesRoot); ConsoleOutput("ClassesRoot"); //遍历LocalMachine表 RegistryKey localMachine = Registry.LocalMachine; RegeditRecursion(localMachine); ConsoleOutput("LocalMachine"); //遍历Users表 RegistryKey users = Registry.Users; RegeditRecursion(users); ConsoleOutput("Users"); //遍历CurrentConfig表 RegistryKey currentConfig = Registry.CurrentConfig; RegeditRecursion(currentConfig); ConsoleOutput("CurrentConfig"); Console.WriteLine("全部递归遍历删除结束"); Console.ReadKey(); } /// <summary> /// 递归遍历删除注册表项和键值 /// </summary> /// <param name="registryKey">注册表项级节点对象</param> static void RegeditRecursion(RegistryKey registryKey) { using (registryKey) { string[] valueNames = registryKey.GetValueNames(); //获取键名称数组 foreach (var valueName in valueNames) { string value = registryKey.GetValue(valueName, true).ToString(); //获取值数据 //先判断键名称中是否含有keyword,再判断值数据是否含有keyword if (valueName.Contains(keyword) || value.Contains(keyword)) { try { //删除数据中含有指定字符串的键值 registryKey.DeleteValue(valueName); } catch (Exception) { keyValueCount += 1; continue; //无权限异常,跳出异常 } } } //获取子项名数组 string[] subKeyNames = registryKey.GetSubKeyNames(); //遍历子项名数组 foreach (var subKeyName in subKeyNames) { if (subKeyName.Contains(keyword)) { try { //递归删除数据中含有指定字符串的子项和任何子级子项。 registryKey.DeleteSubKeyTree(keyword); } catch (Exception) { subKeyUnPermissionsCount += 1; continue; //无权限异常,跳出异常 } } try { RegistryKey subKey = registryKey.OpenSubKey(subKeyName, true); //递归遍历删除注册表项和键值 RegeditRecursion(subKey); } catch (Exception) { otherSubKeyUnPermissionsCount += 1; continue; //无权限异常,跳出异常 } } } } /// <summary> /// 控制台打印输出,并初始化统计数值 /// </summary> /// <param name="rootName">表名</param> static void ConsoleOutput(string rootName) { Console.WriteLine("{0}表递归遍历删除结束,无权限键值个数:{1},无权限子项个数:{2},其他无权限子项个数:{3}", rootName, keyValueCount, subKeyUnPermissionsCount, otherSubKeyUnPermissionsCount); //每张表开始遍历前初始化统计数值 keyValueCount = 0; subKeyUnPermissionsCount = 0; otherSubKeyUnPermissionsCount = 0; } } }