python - 使用 Python winreg 更改注册表项未生效,但不会抛出错误

标签 python python-3.x registry

对于 Python 来说仍然是一个新手,我正在尝试编写一个脚本来允许我更改远程计算机上的特定注册表项,但我在使用它时遇到了一些麻烦。基本上我运行的代码没有错误,但键值也没有设置。我以管理员身份从 Windows 命令提示符运行它,使用在目标计算机上具有管理员权限的帐户。这是相关代码:

registry = winreg.ConnectRegistry(fullSysName, winreg.HKEY_LOCAL_MACHINE)
wholeKey = winreg.OpenKey(registry, "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon", 0, winreg.KEY_ALL_ACCESS)

print('Setting AutoAdminLogon\n')
winreg.SetValue(wholeKey, 'AutoAdminLogon', winreg.REG_SZ, '1')
winreg.CloseKey(wholeKey)


winreg.CloseKey(registry)

fullSysName 是一个变量,包含从脚本前面派生的目标机器名称。该脚本运行没有错误,并且我拥有管理员权限,所以我不知道为什么它不起作用。最终使用一些 Powershell 来完成它,但令我困扰的是我无法让它工作并且至少想了解原因。我已经确认,即使我手动将“fullSysName”替换为机器名称,它也没有效果。感谢您提供的任何提示!

最佳答案

好的,基本上您需要做两件事: 第一个是,当您打开一个 key 并授予对您的程序的访问权限时,您需要更加具体,这意味着您需要指定您的机器是 32 位还是 64 位。因此,例如,我的机器是 64 位的,所以我需要将我的 key 打开方式更改为:

wholeKey = winreg.OpenKey(registry, 'SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon', 0, winreg.KEY_ALL_ACCESS | winreg.KEY_WOW64_64KEY)

对于 32 位机器,您需要添加 winreg.KEY_WOW64_32KEY

第二件事是,SetValue 并不总是有效,所以您需要使用 SetValueEx,它有 5 个参数(添加的参数必须为 0)。所以在你的情况下:

winreg.SetValueEx(wholeKey, 'AutoAdminLogon', 0, winreg.REG_SZ, "1")

您可以在 documentation 中阅读更多相关信息.

关于python - 使用 Python winreg 更改注册表项未生效,但不会抛出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58439138/

相关文章:

python - 用十进制数 64165 位的 `n ** n` 计算 `n`(n 乘以 n)需要多长时间?

python - 多重继承中基类的顺序和 super() 的使用

python - 如何在此代码 Python 中处理 ValueError?

python - IndexError : list index out of range. 谁能帮我解决这个Python代码吗?包括 numpy 和 pandas 的概念

windows - Inno Setup 在注册表中的多字符串键中追加行

python - 在列 block 中展平或分组数组 - NumPy/Python

python - 如何将数据插入 MySQL 数据库?

python - 值错误 : Dependency on app with no migrations: customuser

c++ - regsvr32.exe 为 DLL 添加哪些键?

delphi - 编写/读取Windows注册表-Windows服务