Python code to read registry Python code to read registry python python

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