# Filename: getProgIDsFromRegistry.py # Roy H. Han (http://us.pycon.org/2008/tutorials/AutomatingWindows/) # Import other modules from _winreg import * # Initialize list of keys of search keysToSearch = [ 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 categories print 'Categories: ' + ', '.join(categories) # Sort progIDs progIDs = list(progIDs) progIDs.sort() # Try to open each progID in a separate process import killableprocess # Courtesy of Peter Astrand and Benjamin Smedberg progIDs_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()