zoukankan      html  css  js  c++  java
  • 递归遍历删除注册表项和键值

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

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

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

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

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

    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;
            }
        }
    }
  • 相关阅读:
    超好用的Redis管理及监控工具,使用后可大大提高你的工作效率!
    MySQL,Oracle,PostgreSQL,DB2,mongoDB,Hive, SAP HANA 数据库web维护客户端管理工具
    DB2定时循环同步数据到MySQL
    SQL Server数据同步到MySQL
    powerDesign导出word操作步骤
    数据库工单的主要业务流程
    Redshift数据库客户端工具的使用
    如何提高数据库管理质量?
    远程管理mysql数据库
    SQL工单管理
  • 原文地址:https://www.cnblogs.com/qq641120784/p/5250204.html
Copyright © 2011-2022 走看看