影刀RPA 注册表读写:Windows系统配置操作 影刀RPA 注册表读写Windows系统配置操作作者林焱什么情况用你的影刀流程需要读取Windows系统的某些配置——比如IE浏览器版本、默认程序路径、桌面壁纸位置需要修改注册表来调整系统行为——比如禁用自动更新、修改文件关联需要检查某个软件是否安装、安装路径在哪Windows注册表是系统配置的核心数据库。很多系统设置和软件配置都存在注册表中。在影刀RPA中通过Python的winreg模块可以读写注册表实现系统级配置操作。本文讲清楚注册表的基本结构、怎么读写注册表项、安全注意事项。怎么做一、注册表基本结构HKEY_CLASSES_ROOT (HKCR) ← 文件关联、COM组件 HKEY_CURRENT_USER (HKCU) ← 当前用户配置 HKEY_LOCAL_MACHINE (HKLM) ← 系统级配置 HKEY_USERS (HKU) ← 所有用户配置 [video(video-RdeCyuA6-1784396335567)(type-csdn)(url-https://live.csdn.net/v/embed/525010)(image-https://v-blog.csdnimg.cn/asset/f4faa587144cb7070f19e8b36813806b/cover/Cover0.jpg)(title-店群矩阵自动化突破运营极限)] HKEY_CURRENT_CONFIG (HKCC) ← 当前硬件配置常用路径HKCU\Software\ ← 用户级软件配置 HKLM\SOFTWARE\ ← 系统级软件配置 HKLM\SYSTEM\CurrentControlSet\Services\ ← 系统服务 HKCU\Control Panel\Desktop\ ← 桌面设置二、读取注册表importwinregdefread_registry(hive,subkey,value_name,defaultNone): 读取注册表值 hive: winreg.HKEY_CURRENT_USER, winreg.HKEY_LOCAL_MACHINE 等 subkey: 注册表路径如 rSOFTWARE\Microsoft\Windows\CurrentVersion value_name: 值名称None表示读取默认值 default: 读取失败时返回的默认值 try:# 打开注册表键keywinreg.OpenKey(hive,subkey,0,winreg.KEY_READ)# 读取值value,value_typewinreg.QueryValueEx(key,value_name)winreg.CloseKey(key)returnvalueexceptFileNotFoundError:returndefaultexceptExceptionase:print(f读取注册表失败:{e})returndefault# 常用注册表读取示例 # 1. 读取Windows安装路径windows_dirread_registry(winreg.HKEY_LOCAL_MACHINE,rSOFTWARE\Microsoft\Windows NT\CurrentVersion,SystemRoot,C:\\Windows)print(fWindows目录:{windows_dir})# 2. 读取Windows版本号win_versionread_registry(winreg.HKEY_LOCAL_MACHINE,rSOFTWARE\Microsoft\Windows NT\CurrentVersion,CurrentVersion)print(fWindows版本:{win_version})# 3. 读取计算机名computer_nameread_registry(winreg.HKEY_LOCAL_MACHINE,rSYSTEM\CurrentControlSet\Control\ComputerName\ComputerName,ComputerName)print(f计算机名:{computer_name})# 4. 读取已安装软件列表deflist_installed_software():列出已安装的软件software[]# 从HKCU读取用户级安装try:keywinreg.OpenKey(winreg.HKEY_CURRENT_USER,rSOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall,0,winreg.KEY_READ)foriinrange(0,winreg.QueryInfoKey(key)[0]):subkey_namewinreg.EnumKey(key,i)subkeywinreg.OpenKey(key,subkey_name)nameread_registry(winreg.HKEY_CURRENT_USER,fSOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{subkey_name},DisplayName)ifname:software.append(name)winreg.CloseKey(subkey)winreg.CloseKey(key)except:pass# 从HKLM读取系统级安装try:keywinreg.OpenKey(winreg.HKEY_LOCAL_MACHINE,rSOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall,0,winreg.KEY_READ)foriinrange(0,winreg.QueryInfoKey(key)[0]):subkey_namewinreg.EnumKey(key,i)nameread_registry(winreg.HKEY_LOCAL_MACHINE,fSOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{subkey_name},DisplayName)ifname:software.append(name)winreg.CloseKey(key)except:passreturnsorted(set(software))installedlist_installed_software()print(f已安装软件{len(installed)}个:)fornameininstalled:print(f{name})三、写入注册表importwinregdefwrite_registry(hive,subkey,value_name,value,value_typewinreg.REG_SZ): 写入注册表值 value_type: winreg.REG_SZ(字符串), REG_DWORD(整数), REG_BINARY(二进制) try:# 打开或创建注册表键keywinreg.CreateKey(hive,subkey)# 写入值winreg.SetValueEx(key,value_name,0,value_type,value)winreg.CloseKey(key)print(f已写入注册表:{subkey}\\{value_name}{value})returnTrueexceptPermissionError:print(权限不足需要管理员权限)returnFalseexceptExceptionase:print(f写入注册表失败:{e})returnFalsedefdelete_registry_value(hive,subkey,value_name):删除注册表值try:keywinreg.OpenKey(hive,subkey,0,winreg.KEY_SET_VALUE)winreg.DeleteValue(key,value_name)winreg.CloseKey(key)print(f已删除:{subkey}\\{value_name})returnTrueexceptFileNotFoundError:print(值不存在)returnFalseexceptExceptionase:print(f删除失败:{e})returnFalse# 写入示例 # 1. 写入用户配置用户级不需要管理员权限write_registry(winreg.HKEY_CURRENT_USER,rSOFTWARE\MyRPA\Config,DataDirectory,D:\\rpa_data,winreg.REG_SZ# 字符串类型)write_registry(winreg.HKEY_CURRENT_USER,rSOFTWARE\MyRPA\Config,MaxRetry,5,winreg.REG_DWORD# 整数类型)# 2. 读取写入的配置data_dirread_registry(winreg.HKEY_CURRENT_USER,rSOFTWARE\MyRPA\Config,DataDirectory,D:\\default)max_retryread_registry(winreg.HKEY_CURRENT_USER,rSOFTWARE\MyRPA\Config,MaxRetry,3)print(f数据目录:{data_dir})print(f最大重试:{max_retry})四、枚举注册表子键和值importwinregdefenumerate_registry(hive,subkey): 枚举注册表键下的所有子键和值 result{subkeys:[],values:{}}try:keywinreg.OpenKey(hive,subkey,0,winreg.KEY_READ)# 枚举子键i0whileTrue:try:subkey_namewinreg.EnumKey(key,i)result[subkeys].append(subkey_name)i1exceptOSError:break# 枚举值i0whileTrue:try:name,value,_winreg.EnumValue(key,i)result[values][name]value i1exceptOSError:breakwinreg.CloseKey(key)exceptFileNotFoundError:print(f注册表路径不存在:{subkey})exceptExceptionase:print(f枚举失败:{e})returnresult# 使用查看桌面配置desktop_configenumerate_registry(winreg.HKEY_CURRENT_USER,rControl Panel\Desktop)print(桌面配置:)forname,valueindesktop_config[values].items():print(f{name}{value})五、实战检查软件是否安装defis_software_installed(software_name):检查软件是否已安装返回安装路径search_paths[(winreg.HKEY_LOCAL_MACHINE,rSOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall),(winreg.HKEY_LOCAL_MACHINE,rSOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall),(winreg.HKEY_CURRENT_USER,rSOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall),]software_name_lowersoftware_name.lower()forhive,base_pathinsearch_paths:try:keywinreg.OpenKey(hive,base_path,0,winreg.KEY_READ)foriinrange(winreg.QueryInfoKey(key)[0]):subkey_namewinreg.EnumKey(key,i)subkeywinreg.OpenKey(key,subkey_name)try:display_namewinreg.QueryValueEx(subkey,DisplayName)[0]ifsoftware_name_lowerindisplay_name.lower():install_locationtry:install_locationwinreg.QueryValueEx(subkey,InstallLocation)[0]exceptFileNotFoundError:passwinreg.CloseKey(subkey)winreg.CloseKey(key)return{found:True,name:display_name,location:install_location}exceptFileNotFoundError:passwinreg.CloseKey(subkey)winreg.CloseKey(key)exceptFileNotFoundError:continuereturn{found:False}# 检查Chrome是否安装chromeis_software_installed(Chrome)ifchrome[found]:print(fChrome已安装:{chrome[name]})print(f安装路径:{chrome[location]})else:print(Chrome未安装)有什么坑坑1HKLM写入需要管理员权限现象写入HKEY_LOCAL_MACHINE时报PermissionError。原因HKLM是系统级注册表修改需要管理员权限。普通用户只能修改HKCU。解决以管理员身份运行影刀RPA。或者只修改HKCU当前用户级大部分用户配置都可以放在HKCU下。如果必须修改HKLM在影刀中用管理员权限启动流程。坑2注册表路径中的反斜杠现象rSOFTWARE\Microsoft\Windows中的反斜杠在Python中被转义了。解决注册表路径用原始字符串r或者用双反斜杠\\。推荐用r更清晰# ✅ 正确用原始字符串read_registry(winreg.HKEY_LOCAL_MACHINE,rSOFTWARE\Microsoft\Windows)# ✅ 正确用双反斜杠read_registry(winreg.HKEY_LOCAL_MACHINE,SOFTWARE\\Microsoft\\Windows)[video(video-D7KCAVa3-1784396342306)(type-csdn)(url-https://live.csdn.net/v/embed/524992)(image-https://v-blog.csdnimg.cn/asset/b59aed2f01d4fe8583467562aaf4dcfd/cover/Cover0.jpg)(title-temu店群自动化报活动案例)]# ❌ 错误单反斜杠会被转义# SOFTWARE\Microsoft\Windows ← \M和\W可能不是预期结果坑3WOW6432Node重定向现象在64位Windows上写入HKLM\SOFTWARE\MyApp但读的时候读不到。原因64位Windows会对32位程序的注册表访问进行重定向。32位程序写入SOFTWARE\MyApp实际上被重定向到SOFTWARE\WOW6432Node\MyApp。解决读取时两个路径都检查# 检查两个位置paths[rSOFTWARE\MyApp,rSOFTWARE\WOW6432Node\MyApp]forpathinpaths:valueread_registry(winreg.HKEY_LOCAL_MACHINE,path,key_name)ifvalueisnotNone:break坑4注册表修改后不立即生效现象修改了注册表但系统行为没有变化。原因很多系统设置在启动时读取注册表修改后需要重启或重新登录才生效。有些设置需要通知系统刷新。解决修改后发送WM_SETTINGCHANGE消息通知系统参考环境变量管理的代码。或者提示用户重启电脑。不要期望所有注册表修改都立即生效。坑5误删注册表导致系统问题现象删除了不确定的注册表项导致软件或系统功能异常。解决删除注册表前先备份——先读取并记录要删除的值确认后再删除。绝对不要删除不认识的注册表项。只操作你自己创建的注册表路径如SOFTWARE\MyRPA\。操作系统级别的注册表项不要碰。修改前创建系统还原点。