2013-02-22 7 views
10

У меня возникли проблемы с доступом к реестру Windows 7 с помощью функции _winreg.QueryValueEx в модуле Python 2.7.3 _winreg.Как открыть реестр Windows с правом на запись в Python

Я бегу процесс питона как Administrator, и может создавать новые ключи и значения, как это:

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_WRITE или KEY_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 
+0

мне было бы интересно узнать, как CreateKey без привилегий администратора. – User

+1

@macdonjo: Я думаю, вы не можете сделать это с помощью HKLM из-за ограничений безопасности, но вы, возможно, сможете писать определенные ключи под HKCU ('HKEY_CURRENT_USER') – TrinitronX

+0

Да, я в конечном итоге сделал CURRENT_USER. – User

ответ

20

Я решил эту проблему, выполнив:

key = wreg.OpenKey(wreg.HKEY_LOCAL_MACHINE, "Software\\TestCompany\\TestProject",0, wreg.KEY_ALL_ACCESS) 
+0

Спасибо вам большое! Меня это раздражало какое-то время. Я обнаружил, что я пропустил это в документации для [_winreg.OpenKey()] (http://docs.python.org/2/library/_winreg.html#_winreg.OpenKey). Часть, которую я пропустил, была '_winreg.OpenKey (key, sub_key [, res [, sam]])' ** ... ** 'res - зарезервированное целое число и должно быть равно нулю. Значение по умолчанию равно нулю. – TrinitronX