2013-01-16 8 views
6

के माध्यम से लूपिंग मैं नीचे दिए गए कोड के साथ अपने विंडोज 7 मशीन रजिस्ट्री हाइव "HKEY_LOCAL_MACHINE" से 5 उप-कुंजी सफलतापूर्वक पुनर्प्राप्त करने में सक्षम हूं।पाइथन Winreg उप-कुंजी

from _winreg import * 

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

मेरा प्रश्न है, मैं कैसे तो उन के तहत कुंजी की गणना करते हैं? मैं सॉफ़्टवेयर \ माइक्रोसॉफ्ट \ विंडोज एनटी \ 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 मान दिखाता है लेकिन मैं एक अजगर स्क्रिप्ट मुझे उन छह को दिखाने के लिए नहीं मिल सकता है।

+0

मुझे लगता है कि इस उत्तर में आपकी आवश्यक सारी जानकारी है: http://stackoverflow.com/questions/5227107/python-code-to-read-registry –

+0

हम्म, मुझे अपना प्रश्न संशोधित करने दें। – user1982218

+0

मेरे कंप्यूटर पर उस लिंक पर सूचीबद्ध उदाहरणों में से कोई भी नहीं, लेकिन मेरा cmd व्यवस्थापक के रूप में चल रहा है ... मुझे आश्चर्य है कि कोई अलग समस्या है या नहीं। – user1982218

उत्तर

1

मेरे पास खोजने के लिए एक ही रजिस्ट्री कुंजी नहीं है लेकिन निम्न कोड HKEY_LOCAL_MACHINE \ Software में सभी उपकुंजियों को सूचीबद्ध करेगा। मुझे लगता है कि यदि आप अपनी निर्देशिका में कीवल स्ट्रिंग का मान बदलते हैं तो यह काम करेगा।

try ... except ब्लॉक इस तरह से है क्योंकि EnumKey विफल हो जाएगा। मैंने इसे लूप के रूप में नहीं किया क्योंकि मुझे नहीं पता कि एकी की सही लंबाई कैसे प्राप्त करें।

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' एक स्ट्रिंग देता है जिसे आप फिर कोशिश करते हैं और' पायहेकी 'के रूप में पास करते हैं जो – 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 (हैकी, कीपैथ, टैब = 0) के भीतर, कॉल traverse_registry_tree (उपकीपैथ, टैब + 1) लगता है पहला तर्क छोड़ने के लिए, जो मुझे लगता है, हैकी, मुझे लगता है। – gwideman

+0

अच्छी पकड़, धन्यवाद! फिक्स्ड। – sparrowt

0

सभी उपकुँजियाँ की सूची प्रिंट Windows रजिस्ट्री की कुंजी के माध्यम से पुनरावृत्ति के लिए, आप _winreg मॉड्यूल से EnumKey() की आवश्यकता होगी। EnumKey() के लिए नीचे दिए गए है परिभाषा: -

डीईएफ़ EnumKey (कुंजी, सूचकांक):

  • विश्लेषण करता है एक खुला रजिस्ट्री कुंजी की उपकुँजियाँ।
  • कुंजी पहले से ही खुली कुंजी है, या पूर्वनिर्धारित HKEY_ * स्थिरांक में से कोई भी है।
  • अनुक्रमणिका एक पूर्णांक है जो पुनर्प्राप्त करने के लिए कुंजी की अनुक्रमणिका को पहचानता है।

नोट इस पद्धति है कि, एक तर्क के रूप सूचकांक लेता है, और आप केवल दिए गए इंडेक्स के लिए कुंजी प्रदान करेगा। इसलिए, सभी चाबियाँ प्राप्त करने के लिए, आपको एक से इंडेक्स में वृद्धि करने की आवश्यकता है और जब तक आप WindowsError का सामना नहीं करते हैं तब तक जारी रखें।

एक विस्तृत समझ के लिए this post का संदर्भ लें। कोड के लिए गिथब लिंक पोस्ट में पाया जा सकता है।