2013-01-16 63 views
6

我能夠使用下面的代碼從我的Windows 7機器註冊表配置單元「HKEY_LOCAL_MACHINE」成功檢索5個子鍵。Python winreg通過子鍵循環

from _winreg import * 

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

我的問題是,我怎麼枚舉那些下的鍵?我想最終列出SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ NetworkList \ Signatures \ Unmanaged文件夾中的所有密鑰,但我無法弄清楚如何在那裏下一步。

爲了迴應第一條評論,我在機器上運行了這段代碼,雖然沒有出錯,但沒有產生結果。

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 

一個註冊表編輯器或REG查詢顯示該文件夾中有6個平均值,但我不能讓一個python腳本來給我看這六個。

+0

我覺得這個答案有你需要的所有信息:http://stackoverflow.com/questions/5227107/python-code-to-read-registry –

+0

嗯,讓我修改我的問題。 – user1982218

+0

該鏈接上列出的示例都沒有在我的電腦上工作,但我的cmd正在以管理員身份運行......我想知道是否有其他問題。 – user1982218

回答

1

我沒有要搜索的相同註冊表項,但以下代碼將列出HKEY_LOCAL_MACHINE \ Software中的所有子項。我認爲如果你將keyVal字符串的值更改爲你的目錄,它將起作用。

try ... except集團是這種方式,因爲EnumKey會失敗。我沒有把它當做for循環,因爲我不知道如何獲得正確的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

做了這樣的工作嗎?

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

不,因爲'EnumKey'返回一個字符串,然後您嘗試並通過一個'PyHKEY'不起作用 – sparrowt

0

這工作,並打印出所有子項的列表(的@ 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

在traverse_registry_tree(hkey,keypath,tabs = 0)中,調用traverse_registry_tree(subkeypath,tabs + 1)似乎省略第一個參數,我認爲應該是hkey。 – gwideman

+0

很好,謝謝!固定。 – sparrowt

0

對於通過Windows註冊表鍵迭代,你需要EnumKey()_winreg模塊。下面給出的定義EnumKey(): -

高清EnumKey(鍵,索引):

  • 枚舉的打開註冊表項的子項。
  • 鍵是一個已經打開的鍵或任何一個預定義的HKEY_ *常數。
  • index是一個整數,用於標識要檢索的鍵的索引。

注意,此方法,採用指數作爲參數,並提供您的關鍵只爲給定的指標。因此,爲了獲得所有密鑰,您需要將索引加1並繼續,直到遇到WindowsError

請參閱this post瞭解相同的細節。該代碼的Github鏈接可以在帖子中找到。