Exportieren von Mitgliedern einer/mehrerer/aller AD-Gruppen
Im folgenden Beispiel möchte ich alle User-Accounts aus allen Gruppen exportieren, deren Display Name mit ADM-
anfängt (möchte man alle Gruppen exportieren, lautet der Filter -filter *
). Dabei soll für jede Benutzer-/Gruppen-Kombination eine eigene Zeile erstellt werden, sodass im Anschluss in Excel über die Filter funktion einerseits gefiltert werden kann, welche Gruppe welche Mitglieder hat und andererseits auch welcher Benutzer in welchen Gruppen Mitglied ist.
$Groups = Get-ADGroup -filter {Name -like "ADM-*"} foreach($Group in $Groups) { $Members = Get-ADGroupMember -Recursive -Identity $Group | Select-Object GroupName,SamAccountName | Foreach-Object { $_.GroupName = $Group $_ } | Export-CSV C:\Temp\AD_Groups_And_Members.csv -Append -NoTypeInformation }
Der CSV-Output sieht dann wie folgt aus:
GroupName sAMAccountName CN=ADM-GroupName-1,OU=groups,DC=domain,DC=domain Admin-1 CN=ADM-GroupName-1,OU=groups,DC=domain,DC=domain Admin-2 CN=ADM-GroupName-2,OU=groups,DC=domain,DC=domain Admin-1 CN=ADM-GroupName-2,OU=groups,DC=domain,DC=domain Admin-2 etc...
Um das ganze in eine übersichtlichere Ansicht zu verpacken möchte ich jetzt noch als Group Name den Display Name der Gruppe und nicht ihren Distingiushed Name anzeigen. Dazu muss nur ein Parameter in der 4. Zeile angepasst werden:
$Groups = Get-ADGroup -filter {Name -like "ADM-*"} foreach($Group in $Groups) { $Members = Get-ADGroupMember -Recursive -Identity $Group | Select-Object GroupName,SamAccountName | Foreach-Object { $_.GroupName = $Group.Name $_ } | Export-CSV C:\Temp\AD_Groups_And_Members.csv -Append -NoTypeInformation }
Der CSV-Output ändert sich dadurch wie folgt:
GroupName sAMAccountName ADM-GroupName-1 Admin-1 ADM-GroupName-1 Admin-2 ADM-GroupName-2 Admin-1 ADM-GroupName-2 Admin-2 etc...
Im nächsten Schritt soll auch die Ausführung des Scripts etwas optisch schöner gemacht werden. Dazu füge ich eine Progress-Bar hinzu.
$Groups = Get-ADGroup -filter {Name -like "ADM-*"} $GroupsTotal = $Groups.count $GroupsProcessed = 0 foreach($Group in $Groups) { $GroupsProcessed++ $status = "{0:N0}" -f ($GroupsProcessed / $GroupsTotal * 100) Write-Progress -Activity "Exporting AD Groups" -status "Processing Group $GroupsProcessed of $GroupsTotal : $status% Completed" -PercentComplete ($GroupsProcessed / $GroupsTotal * 100) $Members = Get-ADGroupMember -Recursive -Identity $Group | Select-Object GroupName,SamAccountName | Foreach-Object { $_.GroupName = $Group $_ } | Export-CSV C:\Temp\AD_Groups_And_Members.csv -Append -NoTypeInformation }
—
Vielen Dank für die hilfreichen Tipps!
Unser Ziel war es, Infos/Eigenschaften der einzelnen Gruppenmitglieder zu extrahieren:
Name,Surname,Givenname,Emailaddress,enabled
Diese stecken nicht im Get-ADGroupMember-, sondern im Get-ADUser-Objekt, das leider keine Variablen mit foreach() verwenden kann. Zudem sind wir in einem recht grossen AD, das wir nicht komplett mit Wildcards o.ä. durchsuchen können.
Dafür haben wir Ihr Skript etwas modifiziert.
So hat es dann funktioniert (anonymisiert)
$AllGroups = Get-ADgroup -ResultPageSize 500 -Filter "samAccountName -like 'XXX-*' "-searchbase "OU=XXX,OU=XXX,OU=XXX,DC=XXX,DC=XXX,DC=XXX"
foreach($Group in $AllGroups)
{echo Gruppenname: $Group.Name
$outname = $Group.Name
$outfile = "X:\X\$outname-members.csv"
$outerr = "X:\X\$outname-errs.txt"
$Error.Clear()
Get-ADGroupMember -identity $Group | ForEach-Object{Get-ADUser $_ -Properties emailaddress | Select-Object -Property Name,Surname,Givenname,Emailaddress,enabled | Export-CSV "$outfile" -Encoding utf8 -Append -NoTypeInformation
if($Error -ne $null){echo "$Error" >> $outerr}
#echo "Members ist: $Members"
}
}
echo $Error
Die simple Feherbehandlung ist drin, da wir die Gruppen nicht rekursiv auflösen wollten, aber trotzdem herausfinden, welche Gruppen andere Gruppen enthalten.