使用Python的winreg读取Windows注册表遇PermissionError问题
解决winreg读取注册表时的PermissionError问题
问题根源
- 权限参数不匹配:你的代码打开注册表时用了
winreg.KEY_SET_VALUE,这个权限仅允许修改注册表值,不包含读取权限,所以即使以管理员身份运行,执行读取操作时依然会触发PermissionError。 - 语法错误:
print(valor = winreg.QueryValueEx(reg, "Start"))是无效语法,Python不允许在print函数内直接赋值。 - 64位系统兼容问题:如果你的Python是32位版本,运行在64位Windows上,默认会访问32位注册表分支,需要额外指定
KEY_WOW64_64KEY权限才能访问HKLM下的64位注册表项。
修正后的代码
import winreg try: # 打开注册表项,使用读取权限+64位系统兼容权限 reg_key = winreg.OpenKey( winreg.HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Services\\USBSTOR", access=winreg.KEY_READ | winreg.KEY_WOW64_64KEY ) # 读取"Start"值,返回值和类型 valor, value_type = winreg.QueryValueEx(reg_key, "Start") print(f"Start值: {valor}, 值类型: {value_type}") # 关闭注册表键,释放资源 winreg.CloseKey(reg_key) except PermissionError: print("权限不足,请确认已以管理员身份运行程序") except FileNotFoundError: print("未找到指定的注册表项") except Exception as e: print(f"执行出错: {str(e)}")
关键说明
- 权限参数选择:读取注册表时必须使用
winreg.KEY_READ(或KEY_QUERY_VALUE,更细粒度的读取权限),如果需要同时读写,才需要组合KEY_SET_VALUE等权限。 - 64位系统适配:
KEY_WOW64_64KEY参数让32位Python程序能访问64位系统的注册表项,64位Python可以不加,但加上也不会有问题。 - 资源释放:使用完注册表键后调用
CloseKey释放系统资源,避免资源泄漏。
内容的提问来源于stack exchange,提问作者AnonymousDev
相关产品推荐
相关产品推荐

