Created
July 15, 2018 03:06
-
-
Save semireg/df43cfa9979bec9eadf7e3d160e7a507 to your computer and use it in GitHub Desktop.
This file contains 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
import winreg | |
root_key = "SYSTEM\\CurrentControlSet" | |
w = winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) | |
parents = {} | |
# Look up VID/PID/SERIAL | |
enum_usb_key_string = "{}\\{}".format(root_key, "Enum\\USB") | |
usb_key = winreg.OpenKey(w, enum_usb_key_string) | |
for vp_index in range(winreg.QueryInfoKey(usb_key)[0]): | |
key_val = winreg.EnumKey(usb_key, vp_index) | |
if "VID_0A5F" not in key_val: | |
continue | |
# print("key_val: " + key_val) | |
vid_pid_string = "{}\\{}".format(enum_usb_key_string, key_val) | |
p_serial_key = winreg.OpenKey(w, vid_pid_string) | |
p_serial_count = winreg.QueryInfoKey(p_serial_key)[0] | |
# print("serial_count: {}".format(p_serial_count)) | |
for s_index in range(p_serial_count): # Might be more than one serial for VID/PID pair | |
p_serial = winreg.EnumKey(p_serial_key, s_index) | |
# print("serial: " + p_serial) | |
p_dev_key = winreg.OpenKey(w, "{}\\{}".format(vid_pid_string, p_serial)) | |
p_dev_value_count = winreg.QueryInfoKey(p_dev_key)[1] | |
# print(winreg.QueryInfoKey(p_dev_key)) | |
for dev_value_index in range(p_dev_value_count): | |
value = winreg.EnumValue(p_dev_key, dev_value_index) | |
if "ParentIdPrefix" == value[0]: | |
parents[value[1].upper()] = { 'serial': p_serial } | |
# print("dev_value_index {}: ".format(dev_value_index) + str()) | |
# LOOK UP PRINTER MIDDLEWARE | |
up_root_key_string = "{}\\{}".format(root_key, "Enum\\USBPRINT") | |
up_root_key = winreg.OpenKey(w, up_root_key_string) | |
for up_index in range(winreg.QueryInfoKey(up_root_key)[0]): | |
p_name = winreg.EnumKey(up_root_key, up_index) # e.g. Zebra_TechnologiesZTC_GK420d | |
# print("key_val: " + key_val) | |
p_name_key_string = "{}\\{}".format(up_root_key_string, p_name) | |
p_name_key = winreg.OpenKey(w, p_name_key_string) | |
dev_count = winreg.QueryInfoKey(p_name_key)[0] | |
# print("serial_count: {}".format(p_serial_count)) | |
for parent_index in range(dev_count): # Might be more than one parent for name of device | |
parent_string_full = winreg.EnumKey(p_name_key, parent_index) | |
# print("parent_string_full: " + parent_string_full) | |
parent_parts = parent_string_full.split('&') | |
# print("parts: {}".format(parent_parts)) | |
port = parent_parts[3] | |
translated_key = '&'.join(parent_parts[:3]).upper() | |
parents[translated_key]['port'] = port | |
# print("translated: {}".format(translated_key)) | |
p_dev_key = winreg.OpenKey(w, "{}\\{}".format(p_name_key_string, parent_string_full)) | |
p_dev_value_count = winreg.QueryInfoKey(p_dev_key)[1] | |
# print(winreg.QueryInfoKey(p_dev_key)) | |
for dev_value_index in range(p_dev_value_count): | |
value = winreg.EnumValue(p_dev_key, dev_value_index) | |
if "DeviceDesc" == value[0]: | |
parents[translated_key]['desc'] = value[1] | |
# print("dev_value_index {}: ".format(dev_value_index) + str()) | |
# LOOK UP PRINTERS THEMSELVES | |
p_root_key_string = "{}\\{}".format(root_key, "Control\\Print\\Printers") | |
p_root_key = winreg.OpenKey(w, p_root_key_string) | |
for p_index in range(winreg.QueryInfoKey(p_root_key)[0]): | |
p_name = winreg.EnumKey(p_root_key, p_index) # e.g. Zebra_TechnologiesZTC_GK420d | |
# print("key_val: " + key_val) | |
pnp_string = "{}\\{}\\{}".format(p_root_key_string, p_name, 'PnPData') | |
# print('pnp_string ' + pnp_string) | |
pnp_key = winreg.OpenKey(w, pnp_string) | |
subval_count = winreg.QueryInfoKey(pnp_key)[1] | |
# print("serial_count: {}".format(p_serial_count)) | |
for subval_index in range(subval_count): | |
subval_key = winreg.EnumValue(pnp_key, subval_index) # Looking for PnPData | |
# print('subval_key {}'.format(subval_key)) | |
if subval_key[0] != 'DeviceInstanceId': | |
continue | |
instance_id_parts = subval_key[1].split('\\') | |
parent_parts = instance_id_parts[2].split('&') | |
# port = parent_parts[3] | |
translated_key = '&'.join(parent_parts[:3]).upper() | |
# print('translated_key: {}'.format(translated_key)) | |
if parents.get(translated_key) is None: | |
continue | |
parents[translated_key]['name'] = p_name | |
break | |
printers = {} | |
for parent, data in parents.items(): | |
printers[data['serial']] = { 'name': data['name'] ,'port': data['port'] } | |
for p, data in printers.items(): | |
print('{} {}'.format(p, data)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment