在Windows 7上打开注册表键的问题

4
这段代码曾在Vista(和Windows XP)上运行正常,但升级到Windows 7后,会出现以下错误:
Python 2.6.2 (r262:71605, Apr 14 2009, 22:40:02) [MSC v.1500 32 bit (Intel)] on win32
>>> import _winreg
>>> h1 = _winreg.ConnectRegistry(None, _winreg.HKEY_LOCAL_MACHINE)        
>>> key = r'SOFTWARE\Python\PythonCore\2.6\InstallPath'
>>> h2 = _winreg.OpenKey(h1, key, 0, _winreg.KEY_ALL_ACCESS)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
WindowsError: [Error 5] Access is denied

我相当确定这是Windows 7安全模型变化的结果,但是我尝试了各种搜索,迄今为止没有找到可以用作答案的内容。(并不是说这很重要,但为了避免"你为什么要那样做?"的回复,这是一个开发者工具,可以在多个Python安装之间切换注册表,在需要更多控制Python版本和可用包的多项目环境中使用,而不是像virtualenv这样的东西。)
编辑:登录用户是管理员。此外,我已经完全关闭了UAC(User Access Control)(不正确...请参见下一个编辑),就像从Vista升级到Windows 7之前一样。
编辑2:如我在自己的答案中所述,我在关闭UAC后没有重新启动,因此它仍设置为默认值。显然,这会导致访问被拒绝的错误(正如我通过将UAC设置为默认和从不进行测试所证实的那样)。

你是使用 Windows 7 的 x64 版本还是普通的 32 位版本? - rob
@Roberto,我正在使用32位版本。 - Peter Hansen
2个回答

2
这是一个用户错误,由于Windows 7中UAC功能的实现方式发生了变化而导致复合或触发。在Vista中,备受诟病的用户访问控制功能是二进制的,只有开和关两种状态。在Windows 7中,为提供更高的灵活性,改为提供四个粒度级别:
  • 总是通知(当程序或用户尝试更改设置时)
  • 默认(仅在程序尝试进行更改并调暗屏幕时通知)
  • 不调暗屏幕通知(与默认相同,但不调暗屏幕通知)
  • 从不通知(对于程序或用户更改都不通知)
我的错误在于将UAC功能降至从未通知级别后没有重新启动计算机。(Vista会积极要求您重新启动,而Windows 7似乎略微被动。)

1

我认为你遇到了权限问题。

尝试以较低的权限打开该密钥(例如KEY_QUERY_VALUE),并检查是否有效。 当然,这样更改后你将无法更改注册表,但这只是为了定位问题。
另外一种方法是尝试使用具有更高权限的用户执行实用程序 - 顺便说一下,这是涉及访问权限问题的唯一解决方案。


当然,它可以使用较低的权限。KEY_WRITE 失败了,而 KEY_READ 和 KEY_QUERY_VALUE 是可以工作的。在从 Vista 升级到 Windows 7 之前,它也在同一台机器上正常工作。用户(即我)始终拥有管理员权限,并且我将更新问题以反映这一点,并且我完全关闭了 UAC,就像在升级之前的 Vista 中一样。 - Peter Hansen

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