如何使用Python以写入访问权限打开Windows注册表

12

我遇到了一些问题,使用Python 2.7.3中的_winreg模块的_winreg.QueryValueEx函数访问Windows 7注册表。

我正在以管理员身份运行python进程,并且可以像这样创建新的键和值:

import _winreg as wreg
key = wreg.CreateKey(wreg.HKEY_LOCAL_MACHINE, "Software\\TestCompany\\TestProject")
# Create new subkey
wreg.SetValue(key, 'NewSubkey', wreg.REG_SZ, 'testsubkey')
print wreg.QueryValue(key, 'NewSubKey')
# prints 'testsubkey'
# Create new value
wreg.SetValueEx(key, 'ValueName', 0, wreg.REG_SZ, 'testvalue')
print wreg.QueryValueEx(key,'ValueName')
# prints (u'testvalue', 1)
key.Close()

Keys in Windows Registry

然而,当我重新打开相同的键并尝试设置值时,它会出现“访问被拒绝”的错误:Access is denied
key = wreg.OpenKey(wreg.HKEY_LOCAL_MACHINE, "Software\\TestCompany\\TestProject",wreg.KEY_SET_VALUE)
wreg.SetValue(key, 'NewSubkey', wreg.REG_SZ, 'subkey_changed')
print wreg.QueryValue(key, 'NewSubkey')
# prints 'subkey_changed'
wreg.SetValueEx(key, 'ValueName', 0, wreg.REG_SZ, 'value_changed')

Traceback (most recent call last):
  File "<pyshell#43>", line 1, in <module>
    wreg.SetValueEx(key, 'ValueName', 0, wreg.REG_SZ, 'value_changed')
WindowsError: [Error 5] Access is denied

print wreg.QueryValueEx(key, 'ValueName')
# still prints: (u'testvalue', 1)
key.Close()

有趣的是,以管理员身份运行时,我无法使用KEY_WRITEKEY_ALL_ACCESS访问权限打开它:
>>> key = wreg.OpenKey(wreg.HKEY_LOCAL_MACHINE, "Software\\TestCompany\\TestProject",wreg.KEY_WRITE)

Traceback (most recent call last):
  File "<pyshell#47>", line 1, in <module>
    key = wreg.OpenKey(wreg.HKEY_LOCAL_MACHINE, "Software\\TestCompany\\TestProject",wreg.KEY_WRITE)
WindowsError: [Error 5] Access is denied
>>> key = wreg.OpenKey(wreg.HKEY_LOCAL_MACHINE, "Software\\TestCompany\\TestProject",wreg.KEY_ALL_ACCESS)

Traceback (most recent call last):
  File "<pyshell#48>", line 1, in <module>
    key = wreg.OpenKey(wreg.HKEY_LOCAL_MACHINE, "Software\\TestCompany\\TestProject",wreg.KEY_ALL_ACCESS)
WindowsError: [Error 5] Access is denied

我很想知道如何在没有管理员权限的情况下创建密钥。 - User
1
@macdonjo:我认为由于安全限制,您无法使用HKLM完成此操作,但您可以在HKCU(“HKEY_CURRENT_USER”)下写入某些键。 - TrinitronX
我最终使用CURRENT_USER来代替了。 - User
1个回答

25
我通过以下方式解决了问题:
key = wreg.OpenKey(wreg.HKEY_LOCAL_MACHINE, "Software\\TestCompany\\TestProject",0, wreg.KEY_ALL_ACCESS)

非常感谢!这个问题困扰了我一段时间。我发现我在_winreg.OpenKey()的文档中忽略了一部分。我错过的部分是_winreg.OpenKey(key, sub_key[, res[, sam]]) ... res是一个保留整数,必须为零。默认值为零。 - TrinitronX

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