2013-01-16 13 views
6

sono in grado di recuperare con successo i tasti sub 5 dalle mie finestre 7 macchina registro hive "HKEY_LOCAL_MACHINE" con il codice qui sotto.Python Winreg scorrendo sotto-chiavi

from _winreg import * 

try: 
    i = 0 
    while True: 
     subkey = EnumKey(HKEY_LOCAL_MACHINE, i) 
     print subkey 
     i += 1 
except WindowsError: 
    pass 

La mia domanda è, come posso quindi enumerare le chiavi sotto quelle? Voglio terminare di elencare tutte le chiavi nella cartella SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ NetworkList \ Signatures \ Unmanaged ma non riesco a capire come avanzare laggiù.

In risposta al primo commento, ho eseguito questo codice sulla mia macchina e mentre non ha commesso errori, non ha prodotto risultati.

from _winreg import * 

aReg = ConnectRegistry(None,HKEY_LOCAL_MACHINE) 
aKey = OpenKey(aReg, r"SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList\Signatures\Unmanaged") 
for i in range(1024): 
    try: 
     keyname = EnumKey(aKey, i) 
     asubkey = OpenKey(aKey, keyname) 
     val = QueryValueEx(asubkey, "Description") 
     print val 
    except WindowsError: 
     break 

Un regedit o query reg mostra 6 valori in quella cartella, ma non riesco a ottenere uno script python di mostrarmi chi sei.

+0

Penso che questa risposta abbia tutte le informazioni necessarie: http://stackoverflow.com/questions/5227107/python-code-to-read-registry –

+0

hmm, lasciatemi modificare la mia domanda. – user1982218

+0

Nessuno degli esempi elencati su quel link funziona sul mio computer ma il mio cmd è in esecuzione come admin ... Mi chiedo se c'è un altro problema. – user1982218

risposta

1

Non ho le stesse chiavi del Registro di sistema da cercare, ma il codice seguente elenca tutte le sottochiavi in ​​HKEY_LOCAL_MACHINE \ Software. Penso che se cambi il valore della stringa keyVal nella tua directory funzionerà.

Il try ... except blocco è in questo modo perché EnumKey fallirà. Non l'ho fatto come loop for perché non so come ottenere la lunghezza corretta di aKey.

keyVal = r"Software" 
aKey = OpenKey(HKEY_LOCAL_MACHINE, keyVal, 0, KEY_ALL_ACCESS) 
try: 
    i = 0 
    while True: 
     asubkey = EnumKey(aKey, i) 
     print(asubkey) 
     i += 1 
except WindowsError: 
    pass 
0

Qualcosa come questo funziona?

import _winreg 

def subkeys(key): 
    i = 0 
    while True: 
     try: 
      subkey = _winreg.EnumKey(key, i) 
      yield subkey 
      i+=1 
     except WindowsError: 
      break 

def traverse_registry_tree(key=_winreg.HKEY_LOCAL_MACHINE, tabs=0): 
    for k in subkeys(key): 
     print '\t'*tabs + str(k) 
     traverse_registry_tree(k, tabs+1) 
+0

No, perché 'EnumKey' restituisce una stringa che quindi si prova a passare come' PyHKEY' che non funziona – sparrowt

0

Questo funziona, e stampa l'elenco di tutte le sottochiavi (versione fissa @ risposta di Broseph)

import _winreg 

def subkeys(key): 
    i = 0 
    while True: 
     try: 
      subkey = _winreg.EnumKey(key, i) 
      yield subkey 
      i+=1 
     except WindowsError as e: 
      break 

def traverse_registry_tree(hkey, keypath, tabs=0): 
    key = _winreg.OpenKey(hkey, keypath, 0, _winreg.KEY_READ) 
    for subkeyname in subkeys(key): 
     print '\t'*tabs + subkeyname 
     subkeypath = "%s\\%s" % (keypath, subkeyname) 
     traverse_registry_tree(hkey, subkeypath, tabs+1) 

keypath = r"SOFTWARE\\Microsoft\\Windows" 

traverse_registry_tree(_winreg.HKEY_LOCAL_MACHINE, keypath) 
+0

All'interno di traverse_registry_tree (hkey, keypath, tabs = 0), la chiamata traverse_registry_tree (sottotipo, tabulazioni + 1) sembra per omettere il primo argomento, che dovrebbe essere hkey, penso. – gwideman

+0

Buona cattura, grazie! Fisso. – sparrowt

0

Per scorrendo le chiavi di registro di Windows, si avrebbe bisogno EnumKey() dal modulo _winreg. Dato che segue è la definizione per EnumKey(): -

def EnumKey (chiave, indice):

  • Enumera sottochiavi di una chiave di registro aperta.
  • chiave è una chiave già aperta o una qualsiasi delle costanti HKEY_ * predefinite.
  • indice è un numero intero che identifica l'indice della chiave da recuperare.

Nota che questo metodo, prende indice come argomento, e vi fornirà la chiave solo per il dato indice. Pertanto, per ottenere tutte le chiavi, è necessario incrementare l'indice di uno e continuare finché non si incontra WindowsError.

fare riferimento a this post per la comprensione dettagliata sullo stesso. Il link Github per il codice può essere trovato nel post.