import _winreg import sys import exceptions import array from types import * import string class RegType: def __init__( self, msname, friendlyname ): self.msname=msname self.friendlyname=friendlyname self.intval=getattr( _winreg, msname ) def __repr__( self ): return "" % \ (self.intval, self.msname, self.friendlyname ) _typeConstants={ _winreg.REG_NONE: RegType( "REG_NONE", "None" ), _winreg.REG_SZ: RegType( "REG_SZ", "String" ), _winreg.REG_EXPAND_SZ: RegType("REG_EXPAND_SZ", "Expandable Template String" ), _winreg.REG_BINARY: RegType("REG_BINARY", "Binary Data"), _winreg.REG_DWORD : RegType("REG_DWORD", "Integer" ), # _winreg.REG_DWORD_LITTLE_ENDIAN : # RegType("REG_DWORD_LITTLE_ENDIAN", "Integer"), _winreg.REG_DWORD_BIG_ENDIAN : RegType("REG_DWORD_BIG_ENDIAN", "Big Endian Integer"), _winreg.REG_LINK : RegType("REG_LINK", "Link"), _winreg.REG_MULTI_SZ : RegType("REG_MULTI_SZ", "List of Strings"), _winreg.REG_RESOURCE_LIST : RegType("REG_RESOURCE_LIST", "Resource List"), _winreg.REG_FULL_RESOURCE_DESCRIPTOR : RegType( "REG_FULL_RESOURCE_DESCRIPTOR", "Full Resource Descriptor" ), _winreg.REG_RESOURCE_REQUIREMENTS_LIST: RegType( "REG_RESOURCE_REQUIREMENTS_LIST", "Resource Requirements List" ) } regtypes={} for constant in _typeConstants.values(): regtypes[constant.msname]=constant class _DictBase: def __init__( self, key ): self.key=key def clear( self ): keys=list( self.keys() ) map( self.__delitem__, keys ) def get( self, item, defaultVal=None ): try: return self.__getitem__( item ) except (IndexError, EnvironmentError, WindowsError): return defaultVal def has_key( self, item ): try: self.__getitem__( item ) return 1 except (IndexError, EnvironmentError, WindowsError): return 0 def keys( self ): keys=[] try: for i in xrange( 0, sys.maxint ): keyname = self._nameFromNum( i ) keys.append( keyname ) except (IndexError, EnvironmentError, WindowsError): pass return keys def values( self ): values=[] # map() doesn't use the IndexError semantics... for i in self: values.append( i ) return values def items( self ): return map( None, self.keys(), self.values() ) def __len__( self ): return len( self.keys() ) def _getName( item, nameFromNum ): if type( item ) == IntType: try: keyname = nameFromNum( item ) except (WindowsError, EnvironmentError): raise IndexError, item elif type( item )==StringType: keyname=item else: raise exceptions.TypeError, \ "Requires integer index or string key name" return keyname class RegValuesDict( _DictBase ): def _nameFromNum( self, i ): return self.key._nameFromNum( i ) def __getitem__( self, item ): return self.key.getValueNameDataAndType( item ) def __setitem__( self, name, val): if type( val )==TupleType: data, datatype=val assert isinstance( datatype, RegType ) self.key.setValue( name, data, datatype ) else: self.key.setValue( name, val ) def __delitem__( self, item ): valname=_getName( item, self._nameFromNum ) self.key.deleteValue( valname ) class RegKeysDict( _DictBase ): def _nameFromNum( self, item ): return _winreg.EnumKey( self.key.handle, item ) def __getitem__( self, item ): keyname=_getName( item, self._nameFromNum ) return self.key.openSubkey( keyname ) def __delitem__( self, item ): keyname=_getName( item, self._nameFromNum ) self.key.deleteSubkey( keyname ) def openKey( keyname, samFlags=None ): lst=string.split( keyname, "\\", 1 ) if len( lst )==2: hivename,path=lst return hives[hivename].openSubkey( path ) else: hivename=lst[0] return hives[hivename] def createKey( keyname ): lst=string.split( keyname, "\\", 1 ) assert len( lst )==2 hivename,path=lst return hives[hivename].createSubkey( path ) def deleteKey( keyname ): lst=string.split( keyname, "\\", 1 ) assert len( lst )==2 hivename,path=lst return hives[hivename].deleteSubkey( path ) class RegKey: def _nameFromNum( self, item ): (name,data,datatype)=_winreg.EnumValue( self.handle, item ) return name def __nonzero__(self): if self.handle: return 1 else: return 0 def __cmp__ (self, other ): if hasattr( other, "handle" ) and hasattr( other, "name" ): return cmp( self.name, other.name ) else: return cmp( self.handle, other ) def __init__( self, name, handle=None ): self.name=name self.handle=handle def __repr__( self ): return ""% self.name def close(self ): return _winreg.CloseKey( self.handle ) def getSubkeyNames( self ): return self.getSubkeys().keys() def getValueNames( self ): return self.getValues().keys() def deleteSubkey( self, subkey ): return _winreg.DeleteKey( self.handle, subkey ) def deleteValue( self, valname ): return _winreg.DeleteValue( self.handle, valname ) def createSubkey( self, keyname ): handle=_winreg.CreateKey( self.handle, keyname ) return RegKey( self.name+"\\"+keyname, handle) def openSubkey( self, keyname, samFlags=None ): if samFlags: handle=_winreg.OpenKey( self.handle, keyname, 0, samFlags ) else: handle=_winreg.OpenKey( self.handle, keyname, 0 ) return RegKey( self.name+"\\"+keyname, handle ) def getSubkeys( self ): return RegKeysDict( self ) def getValues( self ): return RegValuesDict( self ) def getValueNameDataAndType( self, valname ): try: if type( valname )==IntType: (valname,data,datatype)=_winreg.EnumValue( self.handle, valname ) else: keyname=_getName( valname, self._nameFromNum ) (data,datatype)=_winreg.QueryValueEx( self.handle, keyname ) except (WindowsError, EnvironmentError): raise IndexError, valname if datatype==_winreg.REG_BINARY: # use arrays for binary data data=array.array( 'c', data ) return (valname, data, _typeConstants[datatype] ) def getValueData( self, valname ): name, data, type=self.getValueNameDataAndType( valname ) return data def setValue( self, valname, data, regtype=None ): if regtype: typeint=regtype.intval else: if type( data )==StringType: typeint=_winreg.REG_SZ elif type( data )==IntType: typeint=_winreg.REG_DWORD elif type( data )==array.ArrayType: typeint=_winreg.REG_BINARY data=data.tostring() _winreg.SetValueEx( self.handle, valname, 0, typeint, data ) def flush(self ): _winreg.FlushKey( self.keyobbj ) def save( self, filename ): _winreg.SaveKey( self.keyobj, filename ) def load( self, subkey, filename ): return _winreg.RegLoadKey( self.handle, subkey, filename ) class RemoteKey( RegKey ): def __init__( self, machine, topLevelKey ): assert topLevelKey in _hivenames self.handle = _winreg.ConnectRegistry( machine, parentKey ) self.name=r"\\%s\%s" % (machine, topLevelKey ) _hivenames = ["HKEY_CLASSES_ROOT","HKEY_CURRENT_USER","HKEY_LOCAL_MACHINE", "HKEY_USERS","HKEY_CURRENT_CONFIG","HKEY_DYN_DATA", "HKEY_PERFORMANCE_DATA"] hives={} for name in _hivenames: hives[name]=RegKey( name, getattr( _winreg, name ) ) hives["HKLM"]=hives["HKEY_LOCAL_MACHINE"] hives["HKCR"]=hives["HKEY_CLASSES_ROOT"] hives["HKCU"]=hives["HKEY_CURRENT_USER"] _flagnames = ["KEY_ALL_ACCESS","KEY_CREATE_LINK", "KEY_CREATE_SUB_KEY", "KEY_ENUMERATE_SUB_KEYS", "KEY_EXECUTE", "KEY_NOTIFY", "KEY_QUERY_VALUE", "KEY_READ", "KEY_SET_VALUE"] flags={} for name in _flagnames: flags[name]=getattr( _winreg, name ) _RegNotifyChangeKeyValueOptions=[ "REG_NOTIFY_CHANGE_ATTRIBUTES", "REG_NOTIFY_CHANGE_SECURITY", "REG_NOTIFY_CHANGE_LAST_SET", "REG_NOTIFY_CHANGE_NAME", "REG_LEGAL_CHANGE_FILTER" ] _RegRestoreKeyOptions=["REG_WHOLE_HIVE_VOLATILE", "REG_NO_LAZY_FLUSH", "REG_OPTION_VOLATILE", "REG_REFRESH_HIVE", "REG_OPTION_NON_VOLATILE", "REG_OPTION_BACKUP_RESTORE" ] _RegCreateKeyExOptions=[ "REG_LEGAL_OPTION", "REG_OPTION_RESERVED", "REG_OPTION_VOLATILE", "REG_OPTION_NON_VOLATILE", "REG_OPTION_BACKUP_RESTORE", "REG_CREATED_NEW_KEY", "REG_OPENED_EXISTING_KEY", "REG_OPTION_CREATE_LINK"] #unusednames=_RegNotifyChangeKeyValueOptions+_RegRestoreKeyOptions+_RegCreateKeyExOptions #typeConstantNames=map( lambda x: x.msname, typeConstants.values() ) #allnames=_hivenames+_flagnames+typeConstantNames+unusednames #winregnames=_winreg.__dict__.keys() #for name in winregnames: # if name not in allnames: # print name