Python脚本调用PsExec执行reg delete删除注册表键失败排查
问题排查与修正
你的代码存在几个核心问题导致执行失败,逐一拆解并修正如下:
1. subprocess参数传递错误
subprocess.call的列表参数要求每个命令行参数单独作为列表元素,但你把reg.exe的所有操作(delete "路径" /f)拼成了一个字符串传给reg.exe,这会导致reg.exe将整个字符串当作单一参数解析,无法识别delete命令、目标路径和/f强制删除选项。
2. 路径拼接不严谨
直接用+拼接路径,若当前工作目录包含空格,会导致PsExec64.exe的路径解析失败,应该用os.path.join做安全路径拼接。
3. 错误输出被屏蔽
你将stderr和stdout都重定向到PIPE,无法看到PsExec或reg.exe返回的具体错误信息,完全失去了排查问题的依据。
修正后的代码
import os import subprocess # 示例注册表目标路径 reg_target_path = r"HKLM\SYSTEM\ControlSet001\Enum\USBSTOR\Disk&Ven_bla_bla_bla" # 拆分reg.exe的操作参数,每个参数单独成项 reg_commands = ["delete", reg_target_path, "/f"] # 安全拼接PsExec的路径 psexec_full_path = os.path.join(os.getcwd(), "PsTools", "PsExec64.exe") # 执行调用,保留控制台输出以便排查错误 exit_code = subprocess.call( [psexec_full_path, "-accepteula", "-s", "C:\\Windows\\System32\\reg.exe"] + reg_commands ) # 通过返回码判断执行结果:0为成功,非0为失败 print(f"执行返回码: {exit_code}")
额外注意事项
- 必须以管理员权限启动Python脚本,即使调用SYSTEM权限的
reg.exe,启动PsExec本身也需要管理员权限。 - 部分USBSTOR子键可能带有特殊权限锁,即使SYSTEM权限也无法直接删除,可先通过
reg.exe或icacls命令调整目标键的权限后再执行删除(注册表键可直接用HKLM\...格式作为icacls的操作参数)。 - 若仍失败,不要屏蔽输出,直接查看控制台返回的错误提示,比如
PsExec是否能正常加载、reg.exe是否返回具体的注册表访问限制信息。
内容的提问来源于stack exchange,提问作者JustAGuy
相关产品推荐
相关产品推荐

