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
    }

1 Antwort

  1. Pete Dawgg sagt:

    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.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.