代码之家  ›  专栏  ›  技术社区  ›  Peter Hansen

在Windows 7上打开注册表项时出现问题

  •  4
  • Peter Hansen  · 技术社区  · 16 年前

    此代码以前在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
    

    我相当肯定这是Windows7中安全模式更改的结果,但是我尝试的各种搜索到目前为止都没有找到可以用作答案的任何内容。

    (不是说它应该是相关的,而是为了避免“你为什么要这样做?”响应,这是为了开发人员的实用程序,它可以在多个安装的python之间切换注册表,在多项目环境中使用,在多项目环境中,我们需要更多的控制哪个版本的python正在使用,哪些包可用,而不是像 virtualenv 可以提供。

    编辑: 登录用户是管理员。另外,我已经尽可能彻底地关闭了UAC(用户访问控制)功能( 不是真的…见下一个编辑 ,与之前从Vista升级到Windows7之前的情况相同。

    编辑2: 正如下面我自己的回答所指出的,关闭UAC后我没有重新启动,所以它仍然被设置为默认值。显然,这会导致访问被拒绝错误(正如我通过将UAC设置为默认值和从不进行测试所确认的那样)。

    2 回复  |  直到 16 年前
        1
  •  2
  •   Peter Hansen    16 年前

    这是一个用户错误,由Windows7中对UAC功能实现方式的更改造成的。

    在Vista中,非常讨厌的用户访问控制功能是二进制的,不管是打开还是关闭。在已更改为提供四级粒度的Windows 7上:

    • 总是通知(当程序或用户试图更改设置时)
    • 默认(仅当程序尝试进行更改时通知,并使屏幕变暗)
    • 无调光通知(与默认相同,但通知时不调暗屏幕)
    • 从不通知(程序或用户更改)

    我的错误是,在将UAC功能降到从不通知级别后没有重新启动。(Vista强烈要求重启,而Windows7似乎稍微被动一点。)

        2
  •  1
  •   rob    16 年前

    我认为你有一个访问权问题。

    尝试用要求较低的访问权限(例如 KEY_QUERY_VALUE )然后检查它是否工作。 当然,有了这个更改,您将无法更改注册表,但它将只用于定位问题。
    另一种选择是,尝试从具有更高权限的用户执行实用程序——顺便说一句,对于涉及访问权限的问题,这是我能看到的唯一解决方案。