2013-01-16 48 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 

にregeditまたはREGクエリは、そのフォルダ内の6つの値を示しているが、私はPythonスクリプトは私にそれらの6を表示することができません。

+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が失敗するため、この方法です。私はaKeyの正しい長さを取得する方法を知らないので、forループとしてはしませんでした。

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

これは動作し、Windowsのレジストリのキーを反復処理するためにすべてのサブキーのリスト(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

をプリントアウトし、あなたは_winregモジュールからEnumKey()が必要になります。下記のEnumKey()の定義される: -

はデフEnumKey(キー、インデックス):

  • が開かれているレジストリキーのサブキーを列挙します。
  • keyは既に開いているキー、または定義済みのHKEY_ *定数のいずれかです。
  • indexは、取得するキーのインデックスを識別する整数です。

(注)このメソッドは、引数としてインデックスを取り、あなたにだけ与えられたインデックスのキーを提供すること。したがって、すべてのキーを取得するには、インデックスを1つ増やして、WindowsErrorに出会うまで続ける必要があります。

詳細は、this postを参照してください。コードのGithubのリンクは、ポストにあります。

関連する問題