def LocalGroupEnum(): "Enumerates all the local groups" resume = 0 nmembers = 0 while 1: data, total, resume = win32net.NetLocalGroupEnum(server, 1, resume) for group in data: verbose("Found group %(name)s:%(comment)s " % group) memberresume = 0 while 1: memberdata, total, memberresume = win32net.NetLocalGroupGetMembers( server, group['name'], 2, resume) for member in memberdata: # Just for the sake of it, we convert the SID to a username username, domain, type = win32security.LookupAccountSid( server, member['sid']) nmembers = nmembers + 1 verbose(" Member %s (%s)" % (username, member['domainandname'])) if memberresume == 0: break if not resume: break assert nmembers, "Couldnt find a single member in a single group!" print "Enumerated all the local groups"
def __get_local_groups__(self): """ En prévision de l'avenir. Sur une machine qui n'est pas contrôleur de domaine la fonction NetGroupEnum ramène un seul groupe qui d'appelle "None". On verra plus tard comment traiter ça. Un indicateur serveur AD / pas serveur AD ? On appelle ça de façon transparente si on se rend compte qu'on n'est pas sur un serveur AD ? On ajoute les groupes locaux aux groupes globaux si on est sur un un serveur AD ? """ groups_list = [] resume = 0 Enr, Total, resume = win32net.NetLocalGroupEnum( self.server, 1, resume, 4096) while 1: for Champ in Enr: group_name = Champ['name'].lower() members_list = [] memberresume = 0 memberdata, total, memberresume = win32net.NetLocalGroupGetMembers( self.server, group_name, 1, memberresume) while 1: for member in memberdata: members_list.append(member['name'].lower()) if memberresume <= 0: break memberdata, total, memberresume = win32net.NetLocalGroupGetMembers( self.server, group_name, 1, memberresume) members_list.sort() groups_list.append([group_name, members_list]) if resume <= 0: break Enr, Total, resume = win32net.NetLocalGroupEnum( self.server, 1, resume, 4096) return groups_list
def _winAuthenticateUser(self): ''' Authenticate a user by Windows-Login on current machine :raises BackendAuthenticationError: If authentication fails. ''' logger.confidential( u"Trying to authenticate user '%s' with password '%s' by win32security" % (self._username, self._password)) try: win32security.LogonUser(self._username, 'None', self._password, win32security.LOGON32_LOGON_NETWORK, win32security.LOGON32_PROVIDER_DEFAULT) if self._forceGroups is not None: self._userGroups = set(self._forceGroups) logger.info(u"Forced groups for user '%s': %s" % (self._username, self._userGroups)) else: gresume = 0 while True: (groups, total, gresume) = win32net.NetLocalGroupEnum(None, 0, gresume) for groupname in (u['name'] for u in groups): logger.debug2(u"Found group '%s'" % groupname) uresume = 0 while True: (users, total, uresume) = win32net.NetLocalGroupGetMembers( None, groupname, 0, uresume) for sid in (u['sid'] for u in users): (username, domain, type) = win32security.LookupAccountSid( None, sid) if username.lower() == self._username.lower(): self._userGroups.add(groupname) logger.debug( u"User {0!r} is member of group {1!r}", self._username, groupname) if uresume == 0: break if gresume == 0: break except Exception as e: raise BackendAuthenticationError( u"Win32security authentication failed for user '%s': %s" % (self._username, e))
def load_libs(): # Load win32security # # Try to open file and ingore the result. This gets win32security loaded and working. # We can then turn off WOW64 and call repeatedly. If we turn off WOW64 first, # win32security will fail to work properly. try: sd = win32security.GetNamedSecurityInfo( ".", win32security.SE_FILE_OBJECT, win32security.OWNER_SECURITY_INFORMATION | win32security.DACL_SECURITY_INFORMATION) except: # nothing pass # Load win32net # # NetLocalGroupEnum fails with like under Windows 7 64-bit, but not XP 32-bit: # pywintypes.error: (127, 'NetLocalGroupEnum', 'The specified procedure could not be found.') dummy = win32net.NetLocalGroupEnum(None, 0, 0, 1000)
def get_all(self): if not self.groups: try: level = 0 resume = 0 while True: grouplist, total, resume = win32net.NetGroupEnum( wpc.conf.remote_server, level, resume, 999999) for u in grouplist: try: sid, name, type = wpc.conf.cache.LookupAccountName( wpc.conf.remote_server, u['name']) self.groups.append(Group(sid)) except: print("[E] failed to lookup sid of %s" % Group['name']) if resume == 0: break except pywintypes.error as e: print("[E] %s: %s" % (e[1], e[2])) try: level = 0 resume = 0 while True: grouplist, total, resume = win32net.NetLocalGroupEnum( wpc.conf.remote_server, level, resume, 999999) for u in grouplist: try: sid, name, type = wpc.conf.cache.LookupAccountName( wpc.conf.remote_server, u['name']) self.groups.append(Group(sid)) except: print("[E] failed to lookup sid of %s" % Group['name']) if resume == 0: break except pywintypes.error as e: print("[E] %s: %s" % (e[1], e[2])) return self.groups
def get_all(self): if self.groups == []: try: level = 0 resume = 0 while True: grouplist, total, resume = win32net.NetGroupEnum( wpc.conf.remote_server, level, resume, 999999) for u in grouplist: try: sid, name, type = wpc.conf.cache.LookupAccountName( wpc.conf.remote_server, u['name']) self.groups.append(group(sid)) except: print "[E] failed to lookup sid of %s" % group[ 'name'] if resume == 0: break except: print "[E] NetGroupEnum failed" try: level = 0 resume = 0 while True: grouplist, total, resume = win32net.NetLocalGroupEnum( wpc.conf.remote_server, level, resume, 999999) for u in grouplist: try: sid, name, type = wpc.conf.cache.LookupAccountName( wpc.conf.remote_server, u['name']) self.groups.append(group(sid)) except: print "[E] failed to lookup sid of %s" % group[ 'name'] if resume == 0: break except: print "[E] NetLocalGroupEnum failed" return self.groups
ws.write(0, 2, 'Group members',style0) #Parsing hostname file and looping to create excel file for h in hostname: print(h, end = '') #Detect empty line in computer list if h == '\n': continue else: h1 = h.strip() try: #Get local groups on sigle host, this is enum not list of groups l = win32net.NetLocalGroupEnum(h1, 0, 0) except: #In case that host is offline script will not stop. It will write that host is offline ws.write(row2, 0, h1) ws.write(row2, 1, 'Offline') row2 = row2 + 1 continue #Initializing list with usernames in group group = [] #Looping through key valye list l[] and creating list of groups for i in l[0]: group.append(i['name']) #Looping through list group[]
def Main(): cgiEnv = lib_common.CgiEnv() grph = cgiEnv.GetGraph() # TODO: Try this on a remote machine. server = None # Run on local machine for the moment. # servName_or_None is for Windows functions where the local host must be None. # servNameNotNone is for our URLs where the hostname must be explicit. if not server or lib_util.IsLocalAddress(server): servName_or_None = None # So it is compatible with WMI. servNameNotNone = lib_uris.TruncateHostname(lib_util.currentHostname) # .home serverNode = lib_common.nodeMachine serverBox = lib_common.gUriGen else: servName_or_None = server servNameNotNone = server serverNode = lib_common.gUriGen.HostnameUri(server) serverBox = lib_common.RemoteBox(server) resume = 0 numMembers = 0 while True: level = 1 data, total, resume = win32net.NetLocalGroupEnum( servName_or_None, level, resume) for group in data: # sys.stderr.write("Group %(name)s:%(comment)s\n" % group) # TODO: Not sure about the groupname syntax. groupName = group['name'] # nodeGroup = lib_common.gUriGen.GroupUri( groupName ) nodeGroup = survol_Win32_Group.MakeUri(groupName, servNameNotNone) grph.add((nodeGroup, pc.property_host, lib_common.nodeMachine)) groupComment = group['comment'] if groupComment != "": groupCommentMaxWidth = max(80, len(groupName)) if len(groupComment) > groupCommentMaxWidth: groupComment = groupComment[:groupCommentMaxWidth] + "..." grph.add((nodeGroup, pc.property_information, lib_common.NodeLiteral(groupComment))) memberresume = 0 while True: levelMember = 2 memberData, total, memberResume = win32net.NetLocalGroupGetMembers( server, group['name'], levelMember, memberresume) for member in memberData: # Converts Sid to username userName, domain, type = win32security.LookupAccountSid( servName_or_None, member['sid']) numMembers = numMembers + 1 # sys.stderr.write(" Member: %s: %s\n" % (userName, member['domainandname'])) # nodeUser = lib_common.gUriGen.UserUri( userName ) nodeUser = survol_Win32_UserAccount.MakeUri( userName, servNameNotNone) # TODO: Not sure about the property. # TODO: Not sure about the username syntax. grph.add((nodeUser, pc.property_group, nodeGroup)) if memberResume == 0: break if not resume: break cgiEnv.OutCgiRdf("LAYOUT_SPLINE")
def Main(): cgiEnv = lib_common.ScriptEnvironment(can_process_remote=True) server = cgiEnv.GetId() grph = cgiEnv.GetGraph() if lib_util.is_local_address(server): serv_name_or_none = None server_node = lib_common.nodeMachine else: serv_name_or_none = server server_node = lib_uris.gUriGen.HostnameUri(server) try: lib_win32.WNetAddConnect(serv_name_or_none) except Exception as exc: # Maybe the machine is not online. lib_common.ErrorMessageHtml(str(exc)) resume = 0 num_members = 0 try: while True: data, total, resume = win32net.NetLocalGroupEnum( serv_name_or_none, 1, resume) for group in data: logging.debug("Group %(name)s:%(comment)s", group) # TODO: Not sure about the groupname syntax. group_name = group['name'] logging.debug("group_name=%s", group_name) node_group = survol_Win32_Group.MakeUri(group_name, server) grph.add((node_group, pc.property_host, server_node)) group_comment = group['comment'] logging.debug("group_comment=%s", group_comment) if group_comment != "": group_comment_max_width = max(80, len(group_name)) if len(group_comment) > group_comment_max_width: group_comment = group_comment[: group_comment_max_width] + "..." grph.add((node_group, pc.property_information, lib_util.NodeLiteral(group_comment))) memberresume = 0 while True: member_data, total, member_resume = win32net.NetLocalGroupGetMembers( serv_name_or_none, group_name, 2, memberresume) for member in member_data: # Converts Sid to username num_members = num_members + 1 try: user_name, domain, the_type = win32security.LookupAccountSid( server, member['sid']) except Exception as exc: logging.warning( "Server=%s LookupAccountSid Caught:%s", server, str(exc)) continue logging.debug("Member: %s: %s server=%s", user_name, member['domainandname'], server) # node_user = serverBox.UserUri( user_name ) node_user = survol_Win32_UserAccount.MakeUri( user_name, server) # TODO: Not sure about the property. # TODO: Not sure about the username syntax. grph.add((node_user, pc.property_group, node_group)) if memberresume == 0: break if not resume: break except Exception as exc: lib_common.ErrorMessageHtml("win32 local groups:" + str(exc)) cgiEnv.OutCgiRdf("LAYOUT_SPLINE")
def Main(): cgiEnv = lib_common.CgiEnv(can_process_remote=True) server = cgiEnv.GetId() grph = cgiEnv.GetGraph() if lib_util.IsLocalAddress(server): servName_or_None = None serverNode = lib_common.nodeMachine else: servName_or_None = server serverNode = lib_common.gUriGen.HostnameUri(server) # http://www.math.uiuc.edu/~gfrancis/illimath/windows/aszgard_mini/movpy-2.0.0-py2.4.4/movpy/lib/win32/Demos/win32netdemo.py # servName_or_None, imper = lib_win32.MakeImpersonate(server) # hostname = "Titi" for example try: lib_win32.WNetAddConnect(servName_or_None) except: # Maybe the machine is not online. exc = sys.exc_info()[1] lib_common.ErrorMessageHtml(str(exc)) resume = 0 numMembers = 0 try: while True: # data, total, resume = win32net.NetLocalGroupEnum(server, 1, resume) data, total, resume = win32net.NetLocalGroupEnum( servName_or_None, 1, resume) for group in data: DEBUG("Group %(name)s:%(comment)s", group) # TODO: Not sure about the groupname syntax. groupName = group['name'] DEBUG("groupName=%s", groupName) # nodeGroup = serverBox.GroupUri( groupName ) nodeGroup = survol_Win32_Group.MakeUri(groupName, server) grph.add((nodeGroup, pc.property_host, serverNode)) groupComment = group['comment'] DEBUG("groupComment=%s", groupComment) if groupComment != "": groupCommentMaxWidth = max(80, len(groupName)) if len(groupComment) > groupCommentMaxWidth: groupComment = groupComment[:groupCommentMaxWidth] + "..." grph.add((nodeGroup, pc.property_information, lib_common.NodeLiteral(groupComment))) memberresume = 0 while True: # memberData, total, memberResume = win32net.NetLocalGroupGetMembers(server, group['name'], 2, resume) memberData, total, memberResume = win32net.NetLocalGroupGetMembers( servName_or_None, groupName, 2, memberresume) for member in memberData: # Converts Sid to username numMembers = numMembers + 1 try: userName, domain, type = win32security.LookupAccountSid( server, member['sid']) except Exception: exc = sys.exc_info()[1] WARNING("Server=%s Caught:%s", server, str(exc)) continue DEBUG("Member: %s: %s server=%s", userName, member['domainandname'], server) # nodeUser = serverBox.UserUri( userName ) nodeUser = survol_Win32_UserAccount.MakeUri( userName, server) # TODO: Not sure about the property. # TODO: Not sure about the username syntax. grph.add((nodeUser, pc.property_group, nodeGroup)) if memberResume == 0: break if not resume: break except Exception: exc = sys.exc_info()[1] lib_common.ErrorMessageHtml("win32 local groups:" + str(exc)) cgiEnv.OutCgiRdf("LAYOUT_SPLINE")