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

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

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

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

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

最保险安全的做法是,在虚拟机上测试

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;
        }
    }
}
原文地址:https://www.cnblogs.com/qq641120784/p/5250204.html