def __get_groups__(self): """ Renvoie un dictionnaire des groupes du serveur avec, pour chacun, la liste de ses membres et le descriptif. N.B. On met tous les noms en minuscules pour ne pas être emmerdé quand on voudra faire "if nom in liste" """ groups_list = {} resume = 0 Enr, Total, resume = win32net.NetGroupEnum(self.server, 2, resume, 4096) while 1: for Champ in Enr: group_name = Champ['name'].lower() group_comment = Champ['comment'] # members_list = self.__get_group_members__(group_name) users_list = [ e[0] for e in self.__get_group_members__(group_name, True) ] members_list = [ e for e in self.__get_group_members__(group_name, False) ] groups_list[group_name] = [ users_list, group_comment, members_list ] if resume <= 0: break Enr, Total, resume = win32net.NetGroupEnum(self.server, 2, resume, 4096) """ Cet abruti de microsoft s'obstine à utiliser des alias pour certains noms ("c:/Utilisateurs" par exemple qui est en réalité c:/Users"...). C'est ainsi que le groupe "domain users" est parfois traduit par "utilisateurs". Pour pas être emmerdés on ajoute artificiellement ces noms à la con. (fruit de l'expérience ! Et c'est certainement pas fini. À adapter aussi en fonction de la langue) """ try: groups_list['administrateurs'] = groups_list['domain admins'] except: pass try: groups_list['administrators'] = groups_list['domain admins'] except: pass try: groups_list['utilisateurs'] = groups_list['domain users'] except: pass try: groups_list['users'] = groups_list['domain users'] except: pass return groups_list
def testGroupsGoodResume(self, server=None): res = 0 level = 0 # setting it to 1 will provide more detailed info while True: (user_list, total, res) = win32net.NetGroupEnum(server, level, res) for i in user_list: pass if not res: break
def __get_groups_names__(self): """ Renvoie la liste des noms des groupes du serveur. On a besoin de cette liste simple pour remplir la liste complète des groupes avec leurs membres, dans la recherche récursive des utilisateurs appartenant indirectement au groupe. """ groups_names = [] resume = 0 Enr, Total, resume = win32net.NetGroupEnum(self.server, 2, resume, 4096) while 1: for Champ in Enr: groups_names.append(Champ['name'].lower()) if resume <= 0: break Enr, Total, resume = win32net.NetGroupEnum(self.server, 2, resume, 4096) return groups_names
def GroupEnum(): "Enumerates all the domain groups" nmembers = 0 resume = 0 while 1: data, total, resume = win32net.NetGroupEnum(GlobalServer, 1, resume) # print "Call to NetGroupEnum obtained %d entries of %d total" % (len(data), total) for group in data: verbose("Found group %(name)s:%(comment)s " % group) memberresume = 0 while 1: memberdata, total, memberresume = win32net.NetGroupGetUsers( GlobalServer, group['name'], 0, resume) for member in memberdata: verbose(" Member %(name)s" % member) nmembers = nmembers + 1 if memberresume == 0: break if not resume: break
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
def GroupEnum(): "Enumerates all the domain groups" nmembers = 0 resume = 0 while 1: data, total, resume = win32net.NetGroupEnum(server, 1, resume) # print "Call to NetGroupEnum obtained %d entries of %d total" % (len(data), total) for group in data: verbose("Found group %(name)s:%(comment)s " % group) memberresume = 0 while 1: memberdata, total, memberresume = win32net.NetGroupGetUsers( server, group["name"], 0, resume) for member in memberdata: verbose(" Member %(name)s" % member) nmembers = nmembers + 1 if memberresume == 0: break if not resume: break assert nmembers, "Couldnt find a single member in a single group!" print("Enumerated all the groups")
def testGroupsBadResume(self, server=None): res = 1 # Can't pass this first time round. with pytest.raises(win32net.error): win32net.NetGroupEnum(server, 0, res)
def __get_groups_V0__(self): """ Version précédente. Je la garde pour conjurer le mauvais sort Renvoie un dictionnaire des groupes du serveur avec, pour chacun, la liste de ses membres et le descriptif. N.B. On met tous les noms en minuscules pour ne pas être emmerdé quand on voudra faire "if nom in liste" """ groups_list = {} resume = 0 Enr, Total, resume = win32net.NetGroupEnum(self.server, 2, resume, 4096) while 1: for Champ in Enr: group_name = Champ['name'].lower() group_comment = Champ['comment'] members_list = [] memberresume = 0 memberdata, total, memberresume = win32net.NetGroupGetUsers( 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.NetGroupGetUsers( self.server, group_name, 1, memberresume) members_list.sort() groups_list[group_name] = [members_list, group_comment] if resume <= 0: break Enr, Total, resume = win32net.NetGroupEnum(self.server, 2, resume, 4096) """ Cet abruti de microsoft s'obstine à utiliser des alias pour certains noms ("c:/Utilisateurs" par exemple qui est en réalité c:/Users"...). C'est ainsi que le groupe "domain users" est parfois traduit par "utilisateurs". Pour pas être emmerdés on ajoute artificiellement ces noms à la con. (fruit de l'expérience ! Et c'est certainement pas fini. À adapter aussi en fonction de la langue) """ try: groups_list['administrateurs'] = groups_list['domain admins'] except: pass try: groups_list['administrators'] = groups_list['domain admins'] except: pass try: groups_list['utilisateurs'] = groups_list['domain users'] except: pass try: groups_list['users'] = groups_list['domain users'] except: pass return groups_list
import win32net #print users users = win32net.NetUserEnum('localhost', 0) print "USERS" print "==========" for user in users[0]: print user['name'] print "" #print groups groups = win32net.NetGroupEnum('localhost', 0) print "GROUPS" print "==========" for group in groups[0]: print group['name'] print "" #print shares shares = win32net.NetShareEnum('localhost', 0) print "SHARES" print "==========" for share in shares[0]: print share['netname'] print "" #print servers servers = win32net.NetServerEnum(None, 100) print "SERVERS" print "==========" for server in servers[0]: