递归遍历删除注册表项和键值

时间:2022-09-04 17:23:07

操作注册表有风险,需谨慎。

在使用以下代码删除注册表项和键值前,请先备份对应的注册表数据。

使用以下代码前提要有当前用户操作注册表的读写权限。

执行以下代码能删除大部分数据,但可能并不完全删除想要删除的数据(有些是权限限制,有些要手动去注册表删除),只是给出一个递归遍历注册表的思路,请按需自行更改代码,但请慎重。

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;
}
}
}