如何在Python中使用winreg打开注册表键时避免PermissionError?

3

我正在尝试使用winreg在Python中打开注册表键,以进行读写操作,但我一直遇到“PermissionError:[WinError 5]访问被拒绝”的问题。

首先,我手动更改了regedit中所需键的权限(如教程所述)。这可以解决问题,但不太方便。我还注意到,例如为图形卡安装更新可能会删除旧键并创建新键,因此您必须在安装更新后调整权限,这很不实用。以管理员身份运行也没有帮助。

import winreg

reg_hive = winreg.HKEY_LOCAL_MACHINE
main_key = r"SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Render"

with winreg.ConnectRegistry(None, reg_hive) as Hive:
    with winreg.OpenKey(
            Hive, main_key, 0, winreg.KEY_ALL_ACCESS) as RenderKey:

        get_subkey_tuple = winreg.QueryInfoKey(RenderKey)
        # this tuple counts sub_key starting with 1
        # we subtract -1 so we get the correct index for range()
        subkey_indices = get_subkey_tuple[0] - 1

        for i in range(0, subkey_indices):
            sub_key = winreg.EnumKey(RenderKey, i)
            final_key_string = main_key + "\\" + sub_key
            print(final_key_string)
            with winreg.OpenKey(Hive, final_key_string, 0, winreg.KEY_ALL_ACCESS) as local_key:
                pass

“winreg.OpenKey”这些行会导致Permissionerror(我还没有手动更改regedit中权限的那些行)。我希望能够在不手动调整权限的情况下打开/读取/写入注册表键。

---编辑--- “reserved”参数与此有关吗?文档对此并没有详细说明。

只用两句话提到了“reserved”: “reserved是保留的整数,必须为零。默认值为零。” 和 “保留可以是任何东西-始终将零传递给API。” 后者仅适用于winreg.SetValueEX()。


1
你有尝试以“管理员”身份运行你的Python代码吗? - Julian
我确实尝试了以管理员身份运行,但没有任何改变。 - theoka
如果你没有权限,那么你的代码中就不能有任何规避权限的操作。 - Klaus Gütter
1
那么其他软件如何获得权限呢?例如,显卡驱动程序更新会删除旧密钥并创建新密钥,我不需要更改注册表中的任何权限即可正常工作。 - theoka
1个回答

0

在这一行中

    with winreg.OpenKey(
            Hive, main_key, 0, winreg.KEY_ALL_ACCESS) as RenderKey:

winreg.KEY_ALL_ACCESS更改为winreg.KEY_SET_VALUE以进行编辑(您在评论中指出想要这样做,但实际上不需要在代码中),或者如果您不需要写入,则使用winreg.KEY_READ
当您使用winreg.KEY_ALL_ACCESS时,您请求对键执行的所有操作的权限,包括创建子键、删除子键和值以及完全删除键。由于某种原因,当您只想设置一个值(或仅读取键)时,权限不是那么严格。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接