Last active
July 23, 2021 22:42
-
-
Save jossef/fb19dc05c2fe1c661c25c09c893bfbcf to your computer and use it in GitHub Desktop.
registry utilities
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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