what - Código Python para leer registro.
framework django para python (4)
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
¿Alguien podría corregir el error? Solo quiero mostrar el "Nombre de pantalla" dentro de las subclaves de la clave HKLM / SOFTWARE / Microsoft / Windows / CurrentVersion / Uninstall. Este es el error que recibo.
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
¿Qué pasa con x86 en x64? Utilice tipos específicos de 64 bits
¿Qué sucede si hay más de 1024 subclaves en "Desinstalar"? Utilice _winreg.QueryInfoKey (clave)
Python 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()
Python 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()
Como se indica en la documentación _winreg.QueryValueEx , debe pasar una clave ya abierta. EnumKey devuelve una cadena, no una clave abierta.
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
Simplifiqué la funcionalidad _winreg
para consultar los valores anidados de una clave de registro dada.
Por ejemplo, esto es lo sencillo que es consultar la clave de registro que solicitó sobre:
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
salida
{''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''}
...
Agrega estas funciones de utilidad también:
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
Documentation dice que EnumKey
devuelve la cadena con el nombre de la clave. Tienes que abrirlo explícitamente con la función _winreg.OpenKey
. He arreglado su fragmento de código:
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
Tenga en cuenta que no todas las claves tienen el valor "Nombre de pantalla" disponible.