2016-07-05 25 views
1

Я пытаюсь удалить определенные ключи реестра через скрипт python.
У меня нет проблем с чтением и удалением ключей из «HKEY_CURRENT_USER», но, пытаясь сделать то же самое из «HKEY_LOCAL_MACHINE», мне страшно WindowsError: [Ошибка 5] Доступ запрещен.
Я запускаю скрипт через IDLE IDE с правами администратора.
вот код:python: как удалить ключ реестра (и подразделы) из HKLM (получение ошибки 5)

from _winreg import *  
ConnectRegistry(None,HKEY_LOCAL_MACHINE) 
OpenKey(HKEY_LOCAL_MACHINE,r'software\wow6432node\App',0,KEY_ALL_ACCESS) 
DeleteKey(OpenKey(HKEY_LOCAL_MACHINE,r'software\wow6432node'),'App') 
+0

Вы можете удалить этот ключ, используя 'regedit' от одного пользователя? – cdarke

+0

@cdarke - да. когда я открываю 'regedit', он запускается как admin (отображается диалоговое окно UAC). Я могу перейти к нужной клавише и удалить ее вместе с ее подразделами. Возможно, проблема со сценарием в том, что он терпит неудачу, потому что «программное обеспечение \ wow6432node \ App» содержит дополнительные подразделы. –

ответ

0

Фигурные это!
выясняется, что раздел реестра не был пустым и содержал несколько подключей.
Мне пришлось сначала перечислить и удалить подразделы, и только тогда я смог удалить главный ключ из HKLM. (также добавлен «try ... except», поэтому он не сломал весь код, в этом случае были проблемы).

0

Перед тем, как удалить ключ, вам необходимо удалить все подразделы.

def deleteSubkey(key0, key1, key2=""): 
    import _winreg 
    if key2=="": 
     currentkey = key1 
    else: 
     currentkey = key1+ "\\" +key2 

    open_key = _winreg.OpenKey(key0, currentkey ,0,_winreg.KEY_ALL_ACCESS) 
    infokey = _winreg.QueryInfoKey(open_key) 
    for x in range(0, infokey[0]): 
     #NOTE:: This code is to delete the key and all subkeys. 
     # If you just want to walk through them, then 
     # you should pass x to EnumKey. subkey = _winreg.EnumKey(open_key, x) 
     # Deleting the subkey will change the SubKey count used by EnumKey. 
     # We must always pass 0 to EnumKey so we 
     # always get back the new first SubKey. 
     subkey = _winreg.EnumKey(open_key, 0) 
     try: 
      _winreg.DeleteKey(open_key, subkey) 
      print "Removed %s\\%s " % (currentkey, subkey) 
     except: 
      deleteSubkey(key0, currentkey, subkey) 
      # no extra delete here since each call 
      #to deleteSubkey will try to delete itself when its empty. 

    _winreg.DeleteKey(open_key,"") 
    open_key.Close() 
    print "Removed %s" % (currentkey) 
    return 

Вот как вы запустите его:

deleteSubkey(_winreg.HKEY_CURRENT_USER, "software\\wow6432node", "App") 
deleteSubkey(_winreg.HKEY_CURRENT_USER, "software\\wow6432node\\App")