在Python中使用winreg打开注册表项时如何避免权限错误?

问题描述 投票:0回答:1

我正在尝试打开注册表项

(HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Render)

在 python 中使用 winreg 进行读写,但我不断遇到

“PermissionError:[WinError 5] 访问被拒绝”

首先,我在注册表中手动更改了我需要的密钥的权限(如this教程中所述)。这可行,但不舒服。我还注意到,安装更新(例如显卡更新)可以删除旧密钥并创建新密钥,因此您始终必须在安装更新后调整权限,这是不切实际的。以管理员身份运行也没有帮助。

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”行导致权限错误(我还没有在注册表中手动更改权限)。我想打开/读取/写入注册表项,而无需手动调整权限。

---编辑--- “保留”参数有什么关系吗?该文档的内容非常薄弱。

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

python permissions key registry winreg
1个回答
1
投票

在这一行

    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
时,您请求对密钥执行的所有操作的权限,包括创建子项、删除子项和值以及完全删除密钥。由于某种原因,当您只想设置一个值(或者,更明显的是,读取密钥)时,权限并不那么严格。

© www.soinside.com 2019 - 2024. All rights reserved.