Python 在 Windows 上删除注册表项的子进程
Python Subprocess to delete reg key on Windows
我的代码没有按预期工作:
import subprocess
key = 'reg delete HKEY_USERS\S-1-5-21-2637495828-1099793317-3825703309-1000\SOFTWARE\Classes\CLSID\{0E270DAA-1BE6-48F2-AC49-D955BE4EEF1D} /f'
subprocess.call(key, shell=True)
运行 Windows 10 64b,也尝试过 subprocess.Popen。
我的第一个想法是我必须以某种方式逃避\,但我不确定这是否是我需要的,也不确定如何去做。
我还尝试使其与 args key = ['reg', 'delete', 'HKEY...'])
列表一起使用,结果相同
python 脚本的结果
C:\test.py
Error : Couldn't find the key or registry value
来自 Windows 提示的命令的结果
C:\reg delete HKEY_USERS\S-1-5-21-2637495828-1099793317-3825703309-1000\SOFTWARE\Classes\CLSID\{0E270DAA-1BE6-48F2-AC49-D955BE4EEF1D} /f
Operation Suceeded
N.B。我导出了密钥,以便在每次成功尝试后再次添加它。
N.B。 Windows return 条消息已翻译,可能不准确。
我是这么认为的(32bit部分)。您 运行 遇到了由 [MS>Docs]: Registry Keys Affected by WOW64.
产生的问题
换句话说(在 64 位 Win 上),对于某些注册表项(包括这个),有 2 个不同的位置:
- 一个用于 64 位(默认(和旧)一个)
- 一个用于32位(b运行d新)
默认情况下,64 位 应用会自动使用 64 位 注册表位置; *32bit8 也是如此(当然可以通过编程方式修改 - 至少对于 64bit 应用程序)。
因此,为了让 32 位 应用程序具有一些硬编码的注册表项,仍然可以在 64 位 Win 上运行(记住 32 位 应用程序中硬编码的密钥现在是 64 位,而且它是 不可见的 到应用程序,而 real 32bit 在其他地方),MS 想到了这个方法。同样的方法适用于文件系统上的路径 (System32 vs SysWOW64 下 C:\Windows).
现在为什么它在 cmdline 中起作用?作为64bit OS,默认的cmd是64bit(启动 64 位 reg.exe),所以它找到了密钥。是的,您有 2 个 cmds(在上述每个文件夹下一个),实际上(几乎)所有 Win 可执行文件(和 .dlls) 是 "duplicated".
要测试,从 C:\Windows\SysWOW64 开始 cmd.exe,然后 运行 reg 命令,它将失败。
最后,为了解决这个问题,将 .py 文件(我注意到你直接 运行 它)与 64bit Python版本(您可能需要下载并安装它)。
我的代码没有按预期工作:
import subprocess
key = 'reg delete HKEY_USERS\S-1-5-21-2637495828-1099793317-3825703309-1000\SOFTWARE\Classes\CLSID\{0E270DAA-1BE6-48F2-AC49-D955BE4EEF1D} /f'
subprocess.call(key, shell=True)
运行 Windows 10 64b,也尝试过 subprocess.Popen。
我的第一个想法是我必须以某种方式逃避\,但我不确定这是否是我需要的,也不确定如何去做。
我还尝试使其与 args key = ['reg', 'delete', 'HKEY...'])
列表一起使用,结果相同
python 脚本的结果
C:\test.py
Error : Couldn't find the key or registry value
来自 Windows 提示的命令的结果
C:\reg delete HKEY_USERS\S-1-5-21-2637495828-1099793317-3825703309-1000\SOFTWARE\Classes\CLSID\{0E270DAA-1BE6-48F2-AC49-D955BE4EEF1D} /f
Operation Suceeded
N.B。我导出了密钥,以便在每次成功尝试后再次添加它。
N.B。 Windows return 条消息已翻译,可能不准确。
我是这么认为的(32bit部分)。您 运行 遇到了由 [MS>Docs]: Registry Keys Affected by WOW64.
产生的问题换句话说(在 64 位 Win 上),对于某些注册表项(包括这个),有 2 个不同的位置:
- 一个用于 64 位(默认(和旧)一个)
- 一个用于32位(b运行d新)
默认情况下,64 位 应用会自动使用 64 位 注册表位置; *32bit8 也是如此(当然可以通过编程方式修改 - 至少对于 64bit 应用程序)。
因此,为了让 32 位 应用程序具有一些硬编码的注册表项,仍然可以在 64 位 Win 上运行(记住 32 位 应用程序中硬编码的密钥现在是 64 位,而且它是 不可见的 到应用程序,而 real 32bit 在其他地方),MS 想到了这个方法。同样的方法适用于文件系统上的路径 (System32 vs SysWOW64 下 C:\Windows).
现在为什么它在 cmdline 中起作用?作为64bit OS,默认的cmd是64bit(启动 64 位 reg.exe),所以它找到了密钥。是的,您有 2 个 cmds(在上述每个文件夹下一个),实际上(几乎)所有 Win 可执行文件(和 .dlls) 是 "duplicated".
要测试,从 C:\Windows\SysWOW64 开始 cmd.exe,然后 运行 reg 命令,它将失败。
最后,为了解决这个问题,将 .py 文件(我注意到你直接 运行 它)与 64bit Python版本(您可能需要下载并安装它)。