Python 3 winreg:无法写入Windows注册表

Python 3 winreg: unable to write to the Windows registry

尝试通过下面提供的路径将值写入HKLM配置单元。 代码静默完成,没有错误或异常,但值仍然相同。 该脚本在Administrator下执行,没有它AccessDenied(5)Windows错误按预期抛出。 未安装可能阻止访问注册表的防病毒软件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def write_to_registry(key_hive, key_path, value_name, value_type, key_value):
    registry_key = None
    try:
        registry_key = winreg.OpenKey(key_hive, key_path, 0, winreg.KEY_WRITE)
        winreg.SetValueEx(registry_key, value_name, 0, value_type, key_value)
        winreg.CloseKey(registry_key)
        return True
    except Exception as e:
        logger.error("Unable to write to registry path {0}\\{1} with exception {2}", key_hive, key_path, e)
        if registry_key is not None:
            winreg.CloseKey(registry_key)
        return False

def winreg_test():
    write_to_registry(winreg.HKEY_LOCAL_MACHINE,
       "SOFTWARE\Microsoft\Windows NT\CurrentVersion",
       "InstallDate",
        winreg.REG_DWORD,
        1520610000)

我甚至怀疑我遇到了某种系统挂钩(Windows NT是一个敏感键,你知道),但手动编辑或使用命令行工作正常

1
reg add"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v InstallDate /t REG_DWORD /d 1520610000 /f

执行"InstallDate"键的编辑没有任何问题

Python 3.6.5

Windows 7 SP1 x64

更新:问题解决了,请参阅下面的解决方案


显然,原因在于x64系统"双"注册表,适用于32位和64位应用程序。 将代码更改为

1
winreg.OpenKey(key_hive, key_path, 0, (winreg.KEY_WOW64_64KEY | winreg.KEY_WRITE))

使事情有效