4

Python スクリプトを使用して、特定のレジストリ キーを削除しようとしています。
「HKEY_CURRENT_USER」からのキーの読み取りと削除に問題はありませんが、「HKEY_LOCAL_MACHINE」から同じことをしようとすると、恐ろしいWindowsError: [Error 5] Access is denied が表示されます。
管理者権限で IDLE IDE 経由でスクリプトを実行しています。
コードは次のとおりです。

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')
4

4 に答える 4

5

キーを削除する前に、すべてのサブキーを削除する必要があります。

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")
于 2016-10-21T19:07:06.963 に答える
0

理解した!
レジストリ キーが空ではなく、複数のサブキーが含まれていることが判明しました。
最初にサブキーを列挙して削除する必要があり、それから初めて HKLM からメイン キーを削除できました。(「try...except」も追加されたので、問題が発生した場合でもコード全体が壊れることはありません)。

于 2016-08-10T07:22:53.010 に答える