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