Skip to content

Instantly share code, notes, and snippets.

@semireg
Created July 15, 2018 03:06
Show Gist options
  • Save semireg/df43cfa9979bec9eadf7e3d160e7a507 to your computer and use it in GitHub Desktop.
Save semireg/df43cfa9979bec9eadf7e3d160e7a507 to your computer and use it in GitHub Desktop.
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