✍️作者王文峰外号神秘小峯 / 山峯中国国学、传统文化与代码爱好者的程序人生期待你的关注和支持vb 的小脚本解决大问题运维篇——注册表操作详解一、开篇注册表的危险和好注册表基础 30 秒二、第一课安全框架——备份、修改、验证1. 标配工具reg.exe 导出导入先收藏这两个命令2. 安全修改模板所有注册表脚本的骨架三、第二课WshShell 读写删三件套1. RegRead / RegWrite / RegDelete 语法速查2. RegRead 的类型返回四、第三课枚举——WMI StdRegProvRegRead 干不了的活五、实战脚本 1开机启动项巡检与清理六、实战脚本 2软件卸载信息巡检资产盘点七、实战脚本 3批量配置备份下发前的必做动作八、实战脚本 4用户环境变量配置HKCU 实战九、避坑清单注册表运维的 8 个深坑十、总结与自测清单 学习教程传送门 往期文章 本文是「vb 的小脚本解决大问题」系列的系统运维篇。注册表是 Windows 的中枢神经——软件配置、开机启动、文件关联、系统策略全在它里面。用 VBScript 操作注册表是 Windows 运维的看家本领但它是把双刃剑改对了批量运维省半天改错了系统起不来。所以这篇的顺序是先讲安全备份/恢复→ 再讲读写枚举三大件 → 最后 4 个实战脚本所有代码完整可跑。一、开篇注册表的危险和好两个真实场景好200 台办公电脑要统一改开机启动项/壁纸/策略手工一台台点要一周脚本下发半小时完事危险某次批量清理残留注册表脚本写错路径层级把正常软件的配置删了被同事追着打。铁律第一条动注册表之前先备份。本文所有写/删操作都强制走备份 → 修改 → 验证三步模板里给你封装好了。注册表基础 30 秒根键Hive内容常见运维场景HKLM本机配置软件、系统、驱动设置需管理员权限改机器级配置HKCU当前用户桌面、启动项、软件偏好用户级配置无需提权HKCR文件关联、COM 注册修文件打开方式HKU/HKCC所有用户 / 硬件配置少量场景值的四种常用类型类型说明例子REG_SZ字符串路径、名称REG_DWORD32 位整数开关0/1、超时秒数REG_EXPAND_SZ可扩展字符串含%windir%环境变量REG_MULTI_SZ多字符串列表项二、第一课安全框架——备份、修改、验证1. 标配工具reg.exe 导出导入先收藏这两个命令 导出某个键到 .reg 文件备份—— /y 表示覆盖已存在的备份文件 shell.Run reg export HKLM\SOFTWARE\MyApp D:\backup\MyApp.reg /y, 0, True 恢复导入 shell.Run reg import D:\backup\MyApp.reg, 0, True 或双击 .reg 文件、regedit /s 静默导入2. 安全修改模板所有注册表脚本的骨架 SafeRegWrite.vbs —— 安全修改注册表的标准三步备份 → 修改 → 验证 用法cscript //nologo SafeRegWrite.vbs Option Explicit Const BACKUP_DIR D:\RegBackup Dim shell, fso, ts, keyPath, valueName, newValue Set shell CreateObject(WScript.Shell) Set fso CreateObject(Scripting.FileSystemObject) keyPath HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\ valueName EnableLUA newValue 1 1开启 UAC示例确认 UAC 开启 ---- 工具写日志 ---- Sub Log(msg) If Not fso.FolderExists(BACKUP_DIR) Then fso.CreateFolder BACKUP_DIR Set ts fso.OpenTextFile(BACKUP_DIR \reg_change.log, 8, True) ts.WriteLine FormatDateTime(Now(), 3) msg ts.Close End Sub ---- 第 1 步备份RegRead 失败说明值本来就不存在也记下来 ---- On Error Resume Next Dim oldValue oldValue shell.RegRead(keyPath valueName) If Err.Number 0 Then Log [备份] 值不存在 keyPath valueName oldValue (不存在) Err.Clear Else Log [备份] 旧值 oldValue End If On Error GoTo 0 第 2 步修改REG_DWORD 类型参数写 REG_DWORD On Error Resume Next shell.RegWrite keyPath valueName, newValue, REG_DWORD If Err.Number 0 Then Log [失败] 写入出错 Err.Number Err.Description Err.Clear WScript.Quit 1 End If On Error GoTo 0 第 3 步验证读回来比对别信写成功没报错 Dim check check shell.RegRead(keyPath valueName) If CLng(check) CLng(newValue) Then Log [成功] 新值 check 旧值 oldValue WScript.Echo 修改成功已写入日志 Else Log [异常] 验证不通过读回 check WScript.Quit 2 End If三步的价值备份让改动可回滚验证防止写了个寂寞权限不足时RegWrite静默失败的坑后面讲。任何批量下发的脚本都必须长这样。三、第二课WshShell 读写删三件套1. RegRead / RegWrite / RegDelete 语法速查Dim shell Set shell CreateObject(WScript.Shell) ---- 读 ---- Dim v v shell.RegRead(HKCU\Environment\Path) 路径末尾【不加】反斜杠 读值 v shell.RegRead(HKCU\Software\MyApp\) 末尾【加】反斜杠 读键的默认值 ---- 写第三个参数是类型---- shell.RegWrite HKCU\Software\MyApp\Version, 1.2.0, REG_SZ 字符串 shell.RegWrite HKCU\Software\MyApp\Timeout, 30, REG_DWORD 数字 shell.RegWrite HKCU\Software\MyApp\Home, %windir%\system32, REG_EXPAND_SZ ---- 删 ---- shell.RegDelete HKCU\Software\MyApp\Version 删值 shell.RegDelete HKCU\Software\MyAppOld\ 删键末尾必须带反斜杠三个必背语法点末尾反斜杠决定操作对象无\是值有\是键RegDelete删键时末尾必须\且键下面不能有子键有就删不掉RegDelete不级联RegWrite不写第三个参数默认REG_SZ——写 DWORD 忘了传类型会存成字符串系统不认这是头号大坑。2. RegRead 的类型返回写入类型读回来的形态REG_SZ/REG_EXPAND_SZ字符串REG_DWORD数字可直接比较REG_MULTI_SZ数组UBound取长度 REG_MULTI_SZ 的读取姿势 Dim arr, i arr shell.RegRead(HKLM\SYSTEM\CurrentControlSet\Control\NetworkProvider\Order) For i 0 To UBound(arr) WScript.Echo arr(i) Next四、第三课枚举——WMI StdRegProvRegRead 干不了的活WshShell不能枚举键和值运维巡检必须用 WMI 的StdRegProv EnumRun.vbs —— 枚举开机启动项HKLM HKCU 的 Run 键 Option Explicit Const HKLM H80000002 Const HKCU H80000001 Dim wmi, reg, rc, subKeys, values, i, name, data Set wmi GetObject(winmgmts:\\.\root\default) Set reg wmi.Get(StdRegProv) ---- 枚举子键 ---- rc reg.EnumKey(HKLM, SOFTWARE\Microsoft\Windows\CurrentVersion, subKeys) If rc 0 Then For i 0 To UBound(subKeys) WScript.Echo 子键 subKeys(i) Next End If ---- 枚举值比子键更常用---- Dim runKey runKey SOFTWARE\Microsoft\Windows\CurrentVersion\Run rc reg.EnumValues(HKLM, runKey, names, types) If rc 0 Then For i 0 To UBound(names) rc reg.GetStringValue(HKLM, runKey, names(i), data) REG_SZ 用 GetStringValue If rc 0 Then WScript.Echo 启动项 names(i) data End If Next Else WScript.Echo 枚举失败返回码 rc 5 权限不足 End IfStdRegProv 常用方法对照按值类型选方法这是它的别扭之处值类型读方法写方法REG_SZGetStringValueSetStringValueREG_EXPAND_SZGetExpandedStringValueSetExpandedStringValueREG_DWORDGetDWORDValueSetDWORDValueREG_MULTI_SZGetMultiStringValueSetMultiStringValue任意EnumValues带类型数组—选型口诀读单值用WshShell.RegRead简单直接枚举、批量、精确类型用StdRegProv。两者常配合StdRegProv 枚举、WshShell 读写。五、实战脚本 1开机启动项巡检与清理场景巡检开机启动项导出清单把指定的流氓启动项清理掉。 StartupAudit.vbs —— 开机启动项巡检 指定项清理 用法cscript //nologo StartupAudit.vbs [/remove 项名] Option Explicit Const HKLM H80000002 Const HKCU H80000001 Const REPORT D:\RegBackup\startup_audit.csv Dim wmi, reg, shell, fso, ts Set wmi GetObject(winmgmts:\\.\root\default) Set reg wmi.Get(StdRegProv) Set shell CreateObject(WScript.Shell) Set fso CreateObject(Scripting.FileSystemObject) Set ts fso.OpenTextFile(REPORT, 2, True) 2 覆盖写 ts.WriteLine 根键,键位置,启动项名称,命令 ---- 巡检两处 Run还有 RunOnce 也可加进来---- AuditRun HKLM, SOFTWARE\Microsoft\Windows\CurrentVersion\Run, HKLM AuditRun HKCU, SOFTWARE\Microsoft\Windows\CurrentVersion\Run, HKCU ts.Close WScript.Echo 清单已导出 REPORT Sub AuditRun(hive, keyPath, hiveName) Dim names, types, i, data, rc rc reg.EnumValues(hive, keyPath, names, types) If rc 0 Or IsNull(names) Then Exit Sub 没有值就跳过 For i 0 To UBound(names) rc reg.GetStringValue(hive, keyPath, names(i), data) If rc 0 Then ts.WriteLine hiveName , keyPath , names(i) , data 需要清理时解开注释先备份 shell.RegDelete hiveName \ keyPath \ names(i) End If Next End Sub⚠️下线启动项的正确姿势先注释掉删除行跑一次只巡检确认清单无误再放开删除——先观察后动手。六、实战脚本 2软件卸载信息巡检资产盘点场景盘点机器上装了什么软件、版本、安装时间——运维资产巡检常用。 SoftwareAudit.vbs —— 遍历卸载表输出软件清单 Option Explicit Const HKLM H80000002 Const UNINST_KEY SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall Dim wmi, reg, shell, fso, ts, subKeys, i, rc, name, ver, dt, count Set wmi GetObject(winmgmts:\\.\root\default) Set reg wmi.Get(StdRegProv) Set shell CreateObject(WScript.Shell) Set fso CreateObject(Scripting.FileSystemObject) Set ts fso.OpenTextFile(D:\RegBackup\software_list.csv, 2, True) ts.WriteLine 软件名称,版本,安装日期 rc reg.EnumKey(HKLM, UNINST_KEY, subKeys) If rc 0 Then WScript.Echo 无法读取卸载表 rc : WScript.Quit 1 count 0 For i 0 To UBound(subKeys) Dim appKey : appKey UNINST_KEY \ subKeys(i) On Error Resume Next name shell.RegRead(HKLM\ appKey \DisplayName) If Err.Number 0 And name Then Err.Clear ver shell.RegRead(HKLM\ appKey \DisplayVersion) If Err.Number 0 Then ver - : Err.Clear dt shell.RegRead(HKLM\ appKey \InstallDate) If Err.Number 0 Then dt - : Err.Clear ts.WriteLine name , ver , dt count count 1 End If Err.Clear On Error GoTo 0 Next ts.Close WScript.Echo 共发现 count 个软件清单已导出说明DisplayName存在才是有效软件项很多是补丁/组件残留Wow6432Node里还有 32 位软件下一节讲。七、实战脚本 3批量配置备份下发前的必做动作 RegBackupAll.vbs —— 批量备份关键注册表项改动前必跑 Option Explicit Dim shell, fso, keys, k, ts, backupDir, stamp, rc Set shell CreateObject(WScript.Shell) Set fso CreateObject(Scripting.FileSystemObject) stamp Year(Now()) Right(0 Month(Now()), 2) Right(0 Day(Now()), 2) backupDir D:\RegBackup\ stamp If Not fso.FolderExists(backupDir) Then fso.CreateFolder backupDir keys Array( _ HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run, _ HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run, _ HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies, _ HKLM\SYSTEM\CurrentControlSet\Services, _ HKCU\Control Panel\Desktop) Set ts fso.OpenTextFile(backupDir \backup_result.log, 2, True) For Each k In keys reg export 的键名要转义反斜杠键名里 \ 用 \\不需要——reg.exe 直接吃原始路径 rc shell.Run(cmd /c reg export k _ backupDir \ Replace(Mid(k, 1, 4) _ Replace(k, \, _), , ) .reg /y, _ 0, True) If rc 0 Then ts.WriteLine [OK] k Else ts.WriteLine [FAIL] k 返回码 rc End If Next ts.Close WScript.Echo 备份完成 backupDir经验把它做成登录脚本/计划任务每周跑哪天误删/中毒/要重装.reg文件就是后悔药。八、实战脚本 4用户环境变量配置HKCU 实战 SetEnv.vbs —— 给当前用户配置环境变量无需管理员 Option Explicit Dim shell, envKey, pathVal Set shell CreateObject(WScript.Shell) envKey HKCU\Environment\ 备份旧 Path On Error Resume Next pathVal shell.RegRead(envKey Path) If Err.Number 0 Then pathVal : Err.Clear On Error GoTo 0 追加工具目录已存在则不重复追加 Dim toolDir : toolDir D:\Tools If InStr(pathVal, toolDir) 0 Then If Right(pathVal, 1) ; Or pathVal Then pathVal pathVal toolDir Else pathVal pathVal ; toolDir End If shell.RegWrite envKey Path, pathVal, REG_EXPAND_SZ WScript.Echo 已追加 toolDir Else WScript.Echo 已存在无需修改 End If 注意环境变量改动要新打开的终端才生效 通知系统刷新可选广播 WM_SETTINGCHANGE 较复杂运维脚本直接提示重新打开终端即可九、避坑清单注册表运维的 8 个深坑#坑症状解法164 位重定向Wow6432Node32 位 cscript 写 HKLM\SOFTWARE落到了Wow6432Node下用64 位 cscript%windir%\System32\cscript.exe或Sysnative路径64 位机器明确目标视图2DWORD 写成字符串配置不生效程序不认RegWrite第三参数REG_DWORD读回验证类型3反斜杠口诀搞反删值删成了键 / 读键读成了值无\是值有\是键贴在显示器边框上4权限不足静默失败RegWrite不报错但没写进去HKLM 操作先判断管理员见下写后验证5RegDelete不级联键有子键时删不掉先删子键/递归删除脚本里递归遍历6REG_EXPAND_SZ当REG_SZ%windir%不展开路径失效环境变量类值必须REG_EXPAND_SZ7没备份就批量下发改坏了无法回滚SafeRegWrite 三步模板强制执行8动系统关键键蓝屏/无法开机SYSTEM\CurrentControlSet、SAM、BCD等区域只读不写管理员权限自检改 HKLM 前先跑这个Function IsAdmin() On Error Resume Next shell.RegWrite HKLM\SOFTWARE\VbsAdminTest\probe, 1, REG_DWORD If Err.Number 0 Then shell.RegDelete HKLM\SOFTWARE\VbsAdminTest\probe shell.RegDelete HKLM\SOFTWARE\VbsAdminTest\ IsAdmin True Else Err.Clear IsAdmin False End If On Error GoTo 0 End Function If Not IsAdmin() Then WScript.Echo 需要管理员权限请右键『以管理员身份运行』 WScript.Quit 1 End If十、总结与自测清单✅铁律先备份后修改再验证SafeRegWrite 三步模板是所有脚本的骨架✅ 读写删用WshShell记住无\是值有\是键DWORD 必须传类型✅ 枚举用StdRegProvEnumKey/EnumValues按类型选GetXXXValue方法✅ 备份用reg export恢复reg import做成周期任务就是后悔药✅ 四个实战脚本启动项巡检、软件资产盘点、批量备份、环境变量配置✅ 8 个深坑64 位重定向、静默失败、不级联删除、系统键禁区……动手前先过一遍✅ HKLM 操作先IsAdmin()自检系统关键区域只读不写。下一篇预告《vb 的小脚本解决大问题场景篇——Excel 自动化与桌面弹窗通知》原定预告或《运维篇二——注册表 WMI 查杀进程与服务管理》评论区说想看哪个 学习教程传送门序号专栏学习内容当前状态01JAVA从入门到进阶的系统知识持续写作中……02Oracle数据库从用法到实战创作中……03vbs脚本手把手教你做脚本完善中……04IDEA牛逼哄哄的编程利器编写中……05面试吐血整理的面试技巧更新中…… 往期文章 精选往期好文更多请移步 我的博客主页 平安壹钱包面试官请你说一下Mybatis的实现原理 Java开发-热点-热门问题精华核心总结-推荐 第一章日常_JAVA_面试题集15含答案 第二章日常_JAVA_面试题集14含答案 往期文章大全…… 点赞 ⭐ 收藏 评论一键三连走起你们的支持是我持续创作的最大动力✨ 以上就是今天的全部内容关注我技术之路不迷路本人详解✍️ 作者王文峰参与 CSDN 2020 年度博客之星评选《Java王大师王天师》外号神秘小峯 / 山峯 中国国学、传统文化与代码爱好者的程序人生期待你的关注和支持 转载说明务必注明来源注明作者王文峰哦 SEO 优化官网定制响应式建站教育培训建站