Python code to read registry
Documentation says that EnumKey
returns string with key's name. You have to explicitly open it with _winreg.OpenKey
function. I've fixed your code snippet:
from _winreg import *aKey = r"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"aReg = ConnectRegistry(None, HKEY_LOCAL_MACHINE)print(r"*** Reading from %s ***" % aKey)aKey = OpenKey(aReg, aKey)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
Please note, that not every key has "DisplayName" value available.
What about x86 on x64? Use 64-bit Specific Types
What if there's more than 1024 sub-keys in "Uninstall"? Use _winreg.QueryInfoKey(key)
Python 2:
import errno, os, _winregproc_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()
Python 3:
import errno, os, winregproc_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()
As it says in the _winreg.QueryValueEx documentation, you need to pass an already open key. EnumKey returns a string, not an open key.
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