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 SysWOW64C:\Windows).

现在为什么它在 cmdline 中起作用?作为64bit OS,默认的cmd64bit(启动 64 位 reg.exe),所以它找到了密钥。是的,您有 2 个 cmds(在上述每个文件夹下一个),实际上(几乎)所有 Win 可执行文件(和 .dlls) 是 "duplicated".

要测试,从 C:\Windows\SysWOW64 开始 cmd.exe,然后 运行 reg 命令,它将失败。

最后,为了解决这个问题,将 .py 文件(我注意到你直接 运行 它)与 64bit Python版本(您可能需要下载并安装它)。