# Filename: getProgIDsFromRegistry.py# Roy H. Han (http://us.pycon.org/2008/tutorials/AutomatingWindows/)# Import other modulesfrom _winreg import *# Initialize list of keys of searchkeysToSearch = [ HKEY_CLASSES_ROOT, OpenKey(HKEY_CURRENT_USER, 'Software'), OpenKey(HKEY_LOCAL_MACHINE, 'Software'),]categories = set(); progIDs = set()# While we have keysToSearch,while keysToSearch: # Get key key = keysToSearch.pop(); count_subkeys = QueryInfoKey(key)[0] # For each subkey, for index in xrange(count_subkeys): subkeyName = EnumKey(key, index) try: subkey = OpenKey(key, subkeyName) except WindowsError: print 'Could not access registry key:', subkeyName subkeyNameLower = subkeyName.lower() # Extract progIDs if 'progid' in subkeyNameLower: categories.add(subkeyNameLower) if 'open' in subkeyNameLower: count_values = QueryInfoKey(subkey)[0] for valueIndex in xrange(1, count_values): progIDs.add(EnumValue(subkey, index)[0]) else: progIDs.add(EnumValue(subkey, 0)[1]) # Recurse children keysToSearch.append(subkey)# Print categoriesprint 'Categories: ' + ', '.join(categories)# Sort progIDs progIDs = list(progIDs)progIDs.sort()# Try to open each progID in a separate processimport killableprocess # Courtesy of Peter Astrand and Benjamin SmedbergprogIDs_dispatchable = []outputFile = open('progIDs_completeFromRegistry.txt', 'wt')for progID in progIDs: print '%d/%d %s' % (progIDs.index(progID), len(progIDs), progID), returnCode = killableprocess.call('python dispatch.py ' + progID, timeout=30) if not returnCode: print '[yes]' outputFile.write(progID + '\n') outputFile.flush() else: print '[no]'outputFile.close()