2016-07-05 97 views
1

我試圖通過python腳本刪除某些註冊表項。
我從「HKEY_CURRENT_USER」中讀取和刪除密鑰沒有問題,但試圖從「HKEY_LOCAL_MACHINE」中執行相同的操作,給我帶來了可怕的Windows錯誤:[Error 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'時,它以管理員身份運行(顯示UAC對話框)。我可以導航到所需的密鑰並刪除它,以及它的子密鑰。 也許這個腳本的問題在於它失敗,因爲'software \ 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")