2011-03-08 14 views
18
from _winreg import * 

"""print r"*** Reading from SOFTWARE\Microsoft\Windows\CurrentVersion\Run ***" """ 
aReg = ConnectRegistry(None,HKEY_LOCAL_MACHINE) 

aKey = OpenKey(aReg, r"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall") 
for i in range(1024): 
    try: 
     asubkey=EnumKey(aKey,i) 
     val=QueryValueEx(asubkey, "DisplayName") 
     print val 
    except EnvironmentError: 
     break 

किसी को भी त्रुटि को दूर कृपया सकते हैं ... मैं सिर्फ कुंजी HKLM \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ स्थापना रद्द करें की उपकुँजियाँ के भीतर "DisplayName" प्रदर्शित करना चाहते हैं यह वह जगह है त्रुटि मैं मिल ..अजगर कोड रजिस्ट्री को पढ़ने के लिए

Traceback (most recent call last): 
    File "C:/Python25/ReadRegistry", line 10, in <module> 
    val=QueryValueEx(asubkey, "DisplayName") 
TypeError: The object is not a PyHKEY object 
+1

बीटीडब्ल्यू, जब आपको ऐसी त्रुटि दिखाई देती है तो यह बदतर है वें प्रिंट करने के लिए 'टाइप (asubkey) .__ नाम __)' यह जानने के लिए कि आप किसके साथ काम कर रहे हैं। – yurymik

उत्तर

24

Documentation का कहना है कि कुंजी के नाम के साथ EnumKey रिटर्न स्ट्रिंग। आपको इसे _winreg.OpenKey फ़ंक्शन के साथ स्पष्ट रूप से खोलना होगा। मैंने आपके कोड स्निपेट को ठीक कर दिया है:


from _winreg import * 

"""print r"*** Reading from SOFTWARE\Microsoft\Windows\CurrentVersion\Run ***" """ 
aReg = ConnectRegistry(None,HKEY_LOCAL_MACHINE) 

aKey = OpenKey(aReg, r"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall") 
for i in range(1024): 
    try: 
     asubkey_name=EnumKey(aKey,i) 
     asubkey=OpenKey(aKey,asubkey_name) 
     val=QueryValueEx(asubkey, "DisplayName") 
     print val 
    except EnvironmentError: 
     break 

कृपया ध्यान दें कि प्रत्येक कुंजी में "DisplayName" मान उपलब्ध नहीं है।

+2

यदि आप 'ओपनके' कॉल करते समय पहले पैरामीटर के रूप में खुली कुंजी का उपयोग करते हैं तो आपको कुंजी के लिए पूर्ण पथ नहीं देना होगा। – Velociraptors

+1

हाँ, आप सही हैं। फिक्स्ड। – yurymik

+2

यह कोई आउटपुट नहीं देता .. –

5

यह _winreg.QueryValueEx प्रलेखन में कहते हैं, आप एक पहले से ही खुला कुंजी पारित करने के लिए की जरूरत है। EnumKey एक स्ट्रिंग देता है, न कि खुली कुंजी।

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

x64 पर x86 के बारे में क्या? Use 64-bit Specific Types

यदि "अनइंस्टॉल करें" में 1024 से अधिक उप-कुंजी हैं तो क्या होगा? Use _winreg.QueryInfoKey(key)

अजगर 2:

import errno, os, _winreg 
proc_arch = os.environ['PROCESSOR_ARCHITECTURE'].lower() 
proc_arch64 = os.environ['PROCESSOR_ARCHITEW6432'].lower() 

if proc_arch == 'x86' and not proc_arch64: 
    arch_keys = {0} 
elif proc_arch == 'x86' or proc_arch == 'amd64': 
    arch_keys = {_winreg.KEY_WOW64_32KEY, _winreg.KEY_WOW64_64KEY} 
else: 
    raise Exception("Unhandled arch: %s" % proc_arch) 

for arch_key in arch_keys: 
    key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, r"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall", 0, _winreg.KEY_READ | arch_key) 
    for i in xrange(0, _winreg.QueryInfoKey(key)[0]): 
     skey_name = _winreg.EnumKey(key, i) 
     skey = _winreg.OpenKey(key, skey_name) 
     try: 
      print _winreg.QueryValueEx(skey, 'DisplayName')[0] 
     except OSError as e: 
      if e.errno == errno.ENOENT: 
       # DisplayName doesn't exist in this skey 
       pass 
     finally: 
      skey.Close() 

अजगर 3:

import errno, os, winreg 
proc_arch = os.environ['PROCESSOR_ARCHITECTURE'].lower() 
proc_arch64 = os.environ['PROCESSOR_ARCHITEW6432'].lower() 

if proc_arch == 'x86' and not proc_arch64: 
    arch_keys = {0} 
elif proc_arch == 'x86' or proc_arch == 'amd64': 
    arch_keys = {winreg.KEY_WOW64_32KEY, winreg.KEY_WOW64_64KEY} 
else: 
    raise Exception("Unhandled arch: %s" % proc_arch) 

for arch_key in arch_keys: 
    key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, r"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall", 0, winreg.KEY_READ | arch_key) 
    for i in range(0, winreg.QueryInfoKey(key)[0]): 
     skey_name = winreg.EnumKey(key, i) 
     skey = winreg.OpenKey(key, skey_name) 
     try: 
      print(winreg.QueryValueEx(skey, 'DisplayName')[0]) 
     except OSError as e: 
      if e.errno == errno.ENOENT: 
       # DisplayName doesn't exist in this skey 
       pass 
     finally: 
      skey.Close() 
+1

अंतिम प्रविष्टि को याद करता है, xrange के लिए स्टॉप पैरामीटर अनन्य है। – CrouZ

+1

धन्यवाद, '-1' गिरा दिया, क्योंकि मुझे लगता है कि आप यही बात कर रहे थे। – VertigoRay

+2

ध्यान रखें कि% PROCESSOR_ARCHITECTURE% 32-बिट पायथन के साथ x86 लौटाता है भले ही ओएस 64-बिट हो। –

1

मैं किसी दिए गए रजिस्ट्री कुंजी के नेस्टेड मानों क्वेरी करने के लिए _winreg कार्यक्षमता को सरल बनाया।

key = r'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall' 

for sub_key in get_sub_keys(key): 
    path = join(key, sub_key) 
    value = get_values(path, ['DisplayName', 'DisplayVersion', 'InstallDate']) 

    if value: 
     print value 

उत्पादन

{'DisplayVersion': u'347.25', 'DisplayName': u'NVIDIA Control Panel 347.25', 'InstallDate': u'20150125'} 
{'DisplayVersion': u'347.25', 'DisplayName': u'NVIDIA Graphics Driver 347.25', 'InstallDate': u'20150125'} 
{'DisplayVersion': u'2.2.2', 'DisplayName': u'NVIDIA GeForce Experience 2.2.2', 'InstallDate': u'20150212'} 
... 

साथ ही इन उपयोगिता कार्यों जोड़ें::

उदाहरण के लिए, यह कैसे सीधी-सपाट यह रजिस्ट्री कुंजी आप के बारे में पूछा क्वेरी करने के लिए है

from _winreg import * 
import os 

roots_hives = { 
    "HKEY_CLASSES_ROOT": HKEY_CLASSES_ROOT, 
    "HKEY_CURRENT_USER": HKEY_CURRENT_USER, 
    "HKEY_LOCAL_MACHINE": HKEY_LOCAL_MACHINE, 
    "HKEY_USERS": HKEY_USERS, 
    "HKEY_PERFORMANCE_DATA": HKEY_PERFORMANCE_DATA, 
    "HKEY_CURRENT_CONFIG": HKEY_CURRENT_CONFIG, 
    "HKEY_DYN_DATA": HKEY_DYN_DATA 
} 

def parse_key(key): 
    key = key.upper() 
    parts = key.split('\\') 
    root_hive_name = parts[0] 
    root_hive = roots_hives.get(root_hive_name) 
    partial_key = '\\'.join(parts[1:]) 

    if not root_hive: 
     raise Exception('root hive "{}" was not found'.format(root_hive_name)) 

    return partial_key, root_hive 


def get_sub_keys(key): 
    partial_key, root_hive = parse_key(key) 

    with ConnectRegistry(None, root_hive) as reg: 
     with OpenKey(reg, partial_key) as key_object: 
      sub_keys_count, values_count, last_modified = QueryInfoKey(key_object) 
      try: 
       for i in range(sub_keys_count): 
        sub_key_name = EnumKey(key_object, i) 
        yield sub_key_name 
      except WindowsError: 
       pass 


def get_values(key, fields): 
    partial_key, root_hive = parse_key(key) 

    with ConnectRegistry(None, root_hive) as reg: 
     with OpenKey(reg, partial_key) as key_object: 
      data = {} 
      for field in fields: 
       try: 
        value, type = QueryValueEx(key_object, field) 
        data[field] = value 
       except WindowsError: 
        pass 

      return data 


def get_value(key, field): 
    values = get_values(key, [field]) 
    return values.get(field) 


def join(path, *paths): 
    path = path.strip('/\\') 
    paths = map(lambda x: x.strip('/\\'), paths) 
    paths = list(paths) 
    result = os.path.join(path, *paths) 
    result = result.replace('/', '\\') 
    return result 
+0

धन्यवाद, यह काम करता है। लेकिन मैं एक विशिष्ट उपकुंजी के लिए मूल्य निकालने के बारे में कैसे जाउंगा?यदि मैं उदाहरण के लिए "अनइंस्टॉल करें" निर्देशिका में किसी विशिष्ट प्रोग्राम (कुंजी चर के लिए) तक ड्रिल करता हूं, तो कुछ भी वापस नहीं आता है। – Sensei

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^