2013-01-16 39 views
6

Tôi có thể truy xuất thành công 5 khóa con từ cửa sổ của tôi 7 máy đăng ký hive "HKEY_LOCAL_MACHINE" với mã bên dưới.Python winreg looping thông qua các khóa phụ

from _winreg import * 

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

Câu hỏi của tôi là, làm thế nào để tôi liệt kê các khóa theo những? Tôi muốn kết thúc liệt kê tất cả các khóa trong thư mục SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ NetworkList \ Signatures \ Unmanaged nhưng tôi không thể tìm ra cách để đi xuống đó.

Để trả lời nhận xét đầu tiên, tôi đã chạy mã này trên máy của mình và trong khi nó không bị lỗi, nó không tạo ra kết quả.

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 

Truy vấn regedit hoặc reg hiển thị 6 giá trị trong thư mục đó nhưng tôi không thể lấy tập lệnh python để hiển thị cho tôi sáu giá trị đó.

+0

Tôi nghĩ câu trả lời này có tất cả thông tin bạn cần: http://stackoverflow.com/questions/5227107/python-code-to-read-registry –

+0

hmm, hãy để tôi sửa đổi câu hỏi của mình. – user1982218

+0

Không có ví dụ nào được liệt kê trên liên kết đó hoạt động trên máy tính của tôi nhưng cmd của tôi đang chạy dưới dạng quản trị viên ... Tôi tự hỏi liệu có sự cố khác không. – user1982218

Trả lời

1

Tôi không có khóa đăng ký giống nhau để tìm kiếm nhưng mã sau sẽ liệt kê tất cả các khóa con trong HKEY_LOCAL_MACHINE \ Software. Tôi nghĩ rằng nếu bạn thay đổi giá trị của chuỗi keyVal vào thư mục của bạn, nó sẽ hoạt động.

Các try ... except khối là cách này vì EnumKey sẽ không thành công. Tôi đã không làm điều đó như là một vòng lặp vì tôi không biết làm thế nào để có được chiều dài chính xác của 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

Có điều gì giống như tác phẩm này không?

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

Không vì 'EnumKey' trả về một chuỗi mà sau đó bạn thử và chuyển vào như một' PyHKEY' không hoạt động – sparrowt

0

này hoạt động, và in ra danh sách tất cả các khóa con (phiên bản cố định của @ câu trả lời Broseph của)

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

Trong vòng traverse_registry_tree (hkey, keypath, tabs = 0), cuộc gọi traverse_registry_tree (subkeypath, tabs + 1) dường như để bỏ qua đối số đầu tiên, điều này nên là hkey, tôi nghĩ vậy. – gwideman

+0

Tốt, cảm ơn! Đã sửa. – sparrowt

0

Đối lặp lại thông qua các phím của Windows registry, bạn sẽ cần EnumKey() từ _winreg module. Đưa ra dưới đây là định nghĩa cho EnumKey(): -

def EnumKey (key, index):

  • liệt kê subkeys của một khóa registry mở.
  • Phím
  • là một khóa đã mở hoặc bất kỳ một hằng số HKEY_ * được xác định trước nào.
  • chỉ mục là số nguyên xác định chỉ mục của khóa cần truy xuất.

Lưu ý rằng phương pháp này, lấy chỉ mục làm đối số và chỉ cung cấp cho bạn khóa cho chỉ mục đã cho. Do đó, để có được tất cả các khóa, bạn cần tăng chỉ số lên một và tiếp tục cho đến khi bạn gặp phải WindowsError.

Tham khảo this post để hiểu chi tiết. Liên kết Github cho mã có thể được tìm thấy trong bài đăng.

Các vấn đề liên quan