Skip to content

Instantly share code, notes, and snippets.

@jossef
Last active July 23, 2021 22:42
Show Gist options
  • Select an option

  • Save jossef/fb19dc05c2fe1c661c25c09c893bfbcf to your computer and use it in GitHub Desktop.

Select an option

Save jossef/fb19dc05c2fe1c661c25c09c893bfbcf to your computer and use it in GitHub Desktop.
registry utilities
from _winreg import *
import os
import platform
ROOTS_HIVES = {
"HKCU": HKEY_CLASSES_ROOT,
"HKEY_CLASSES_ROOT": HKEY_CLASSES_ROOT,
"HKCR": HKEY_CLASSES_ROOT,
"HKEY_CURRENT_USER": HKEY_CURRENT_USER,
"HKLM": HKEY_LOCAL_MACHINE,
"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 is_32_bit():
return platform.machine().endswith('86')
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)
if is_32_bit():
sams = [0]
else:
sams = [
KEY_WOW64_64KEY,
KEY_WOW64_32KEY
]
for sam in sams:
with ConnectRegistry(None, root_hive) as reg:
with OpenKey(reg, key, 0, KEY_READ | sam) 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)
if is_32_bit():
sams = [0]
else:
sams = [
KEY_WOW64_64KEY,
KEY_WOW64_32KEY
]
for sam in sams:
with ConnectRegistry(None, root_hive) as reg:
with OpenKey(reg, key, 0, KEY_READ | sam) 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)
result = os.path.join(path, *paths)
result = result.replace('/', '\\')
return result
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment