Option Explicit Dim MyDistinguishedName Dim objRootDSE, objItem, objConnection, objCommand, objRecordSet Dim strContainer, strname Dim intCounter Dim dicSeenGroupMember 'Dictionnaire qui va contenir la liste des membres uniques de tous les groupes injectés en entrée set dicSeenGroupMember = CreateObject("Scripting.Dictionary") Dim varObjectCategory, varPosition Dim varCompteur, varMesCles, varMesValeurs Dim objFSO, objTextFile Dim NomFichier, CheminFichier, CheminScriptActuel, ScriptFileName, Position Dim CompteurTotal Dim ListeDesGroupes, varUnGroup, varArrayGroups, varFiltreRequeteAD ListeDesGroupes = "NomGroupe1;NomGroupe2" strContainer = "" 'Si vous souhaitez vous connecter à une OU en particulié, indiquez la ici Const ADS_UF_ACCOUNTDISABLE = 2 Const ADS_SCOPE_SUBTREE = 2 Const ForReading = 1 Const ForWritting = 2 Const ForAppending = 8 ScriptFileName = wscript.scriptname Position = InstrRev(ScriptFileName,".") if (Position > 0) Then ScriptFileName = Left(ScriptFileName, Position - 1) NomFichier = ScriptFileName & "_out.txt" CheminScriptActuel = Left(wscript.scriptfullname,Len(wscript.scriptfullname)-Len(wscript.scriptname)-1) CheminFichier = CheminScriptActuel & "\" & NomFichier 'Déclaration du chemin et du nom du fichier If Len(CheminFichier) > 0 Then Set objFSO = CreateObject("Scripting.FileSystemObject") Set objTextFile = objFSO.OpenTextFile(CheminFichier, ForWritting, True) On Error Resume Next Set objRootDSE = GetObject("LDAP://rootDSE") If strContainer = "" Then Set objItem = GetObject("LDAP://" & objRootDSE.Get("defaultNamingContext")) Else Set objItem = GetObject("LDAP://" & strContainer & "," & _ objRootDSE.Get("defaultNamingContext")) End If On Error Goto 0 'strname = objItem.Get("name") 'WScript.Echo "name: " & strname MyDistinguishedName = objItem.Get("distinguishedName") 'Récupération du distinguishedName du domaine par défaut. Exemple DC=Cotonso,DC=Com 'WScript.Echo "distinguishedName: " & MyDistinguishedName Set objConnection = CreateObject("ADODB.Connection") objConnection.Open "Provider=ADsDSOObject;" Set objCommand = CreateObject("ADODB.Command") objCommand.ActiveConnection = objConnection 'Pour une liste de groupes donnés, on sort les membres varArrayGroups = Split(ListeDesGroupes, ";") varFiltreRequeteAD = "" For Each varUnGroup in varArrayGroups varFiltreRequeteAD = varFiltreRequeteAD & "(sAMAccountName=" & varUnGroup & ")" Next 'WScript.echo "Filtre requete ldap pour les groupes : " & varFiltreRequeteAD 'objCommand.CommandText = ";(objectCategory=Group);name,cn,displayName,sAMAccountName,distinguishedName,member;subtree" 'objCommand.CommandText = ";(&(objectCategory=Group)(|(sAMAccountName=aeff1 nom affiche dans AD)(sAMAccountName=aeff2)));name,cn,displayName,sAMAccountName,distinguishedName,member,objectCategory;subtree"' objCommand.CommandText = ";(&(objectCategory=Group)(|" & varFiltreRequeteAD & "));name,cn,displayName,sAMAccountName,distinguishedName,member,objectCategory;subtree"' objCommand.Properties("Page Size") = 10000 objCommand.Properties("Timeout") = 30 objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE objCommand.Properties("Cache Results") = False 'On liste les membres. 'On ajoute dans le dictionnaire que les users qui n'y sont pas déjà 'Si c'est un groupe, on liste les membres et on ajout les membres de type user au dictionnaire si ils n'y sont pas déjà. Si un membre est un groupe, on liste les membres de ce groupe etc ... Set objRecordSet = objCommand.Execute intCounter = 0 CompteurTotal = 0 Do Until objRecordset.EOF 'WScript.echo objRecordset.Fields("distinguishedName") 'WScript.echo "Name : " & VbTab & objRecordset.Fields("Name") 'WScript.echo VbTab & "cn : " & VbTab & objRecordset.Fields("cn") 'WScript.echo VbTab & "displayName : " & VbTab & objRecordset.Fields("displayName") 'WScript.echo VbTab & "sAMAccountName : " & VbTab & objRecordset.Fields("sAMAccountName") 'WScript.echo VbTab & "distinguishedName : " & VbTab & objRecordset.Fields("distinguishedName") 'WScript.echo VbTab & "objectCategory : " & VbTab & objRecordset.Fields("objectCategory") 'WScript.echo "Exploration de " & objRecordset.Fields("distinguishedName") Call ExplorerGroupeEtAjoutMembresDansDico(objRecordset.Fields("distinguishedName"),dicSeenGroupMember) objRecordset.MoveNext Loop objConnection.Close 'On affiche le contenu du dico. En fait les valeurs sont directement les clés 'varMesValeurs = dicSeenGroupMember.keys 'For varCompteur=0 To ubound(varMesValeurs) 'wscript.echo varMesValeurs(varCompteur) 'wscript.echo "dico(" & cles(i) & ")=" & dico.item(cles(i)) 'Next varMesCles=dicSeenGroupMember.keys For varCompteur=0 To ubound(varMesCles) 'wscript.echo "dicSeenGroupMember(" & varMesCles(varCompteur) & ")=" & dicSeenGroupMember.item(varMesCles(varCompteur)) 'wscript.echo dicSeenGroupMember.item(varMesCles(varCompteur)) objTextFile.WriteLine(dicSeenGroupMember.item(varMesCles(varCompteur))) Next objTextFile.WriteLine("") objTextFile.WriteLine("Nombre total de users uniques : " & CompteurTotal) objTextFile.Close 'Fermeture du fichier Set objTextFile = Nothing Set objFSO = Nothing Else Wscript.echo "Operation annulee" End If 'CheminFichier Function ExplorerGroupeEtAjoutMembresDansDico (ByVal GroupDistinguishedName, ByRef dicSeenGroupMember) Dim ObjGroupAExplorer, objMember 'Wscript.echo "Exploration du groupe " & GroupDistinguishedName Set ObjGroupAExplorer = GetObject("LDAP://" & GroupDistinguishedName) for each objMember In ObjGroupAExplorer.Members If objMember.Class = "group" Then 'WScript.echo "Exploration du sous groupe " & objMember.distinguishedName Call ExplorerGroupeEtAjoutMembresDansDico(objMember.distinguishedName,dicSeenGroupMember) Else if dicSeenGroupMember.Exists(objMember.ADsPath) then 'Do Nothing else 'WScript.echo "Ajout d'un user : " & objMember.ADsPath 'dicSeenGroupMember.Add objMember.ADsPath, objMember.sAMAccountName dicSeenGroupMember.Add objMember.ADsPath, objMember.DisplayName CompteurTotal = CompteurTotal + 1 end if End If next End Function