TUTOS.EU

Lister les users d'une liste de groupes d'un domaine AD (nested)

Dresse la liste de l'ensemble des utilisateurs d'une liste de groupes AD

Indiquez les groupes à interroger dans la variable ListeDesGroupes
Ici il y en a 2 :
ListeDesGroupes = "NomGroupe1;NomGroupe2"

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 = "<LDAP://" & MyDistinguishedName & ">;(objectCategory=Group);name,cn,displayName,sAMAccountName,distinguishedName,member;subtree"
	'objCommand.CommandText = "<LDAP://" & MyDistinguishedName & ">;(&(objectCategory=Group)(|(sAMAccountName=aeff1 nom affiche dans AD)(sAMAccountName=aeff2)));name,cn,displayName,sAMAccountName,distinguishedName,member,objectCategory;subtree"'
	objCommand.CommandText = "<LDAP://" & MyDistinguishedName & ">;(&(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
Lien vers le fichier : cliquez ici