HOWTO · PowerShell

Abrufen aller Gruppenmitgliedschaften eines Benutzers mithilfe von PowerShell

Vergleichen Sie vier Methoden, um die Active-Directory-Gruppenmitgliedschaften eines Benutzers mit PowerShell aufzulisten, einschließlich ihrer Voraussetzungen und des Umfangs ihrer Ergebnisse.

Auf dieser Seite

Um die Active-Directory-Gruppen eines Benutzers aufzulisten, können Sie den älteren Befehl net, ADSI, DirectorySearcher oder das Active-Directory-Modul verwenden. Die ersten drei Methoden nutzen Windows-Verzeichnisdienste, ohne dass dieses Modul installiert sein muss. Ist das Modul verfügbar, ist das Cmdlet der direkteste Weg. Alle Methoden setzen eine Verbindung zu einem Domänencontroller und ein Konto mit Leseberechtigung für das Verzeichnis voraus. „Alle“ bezeichnet hier die Mitgliedschaften, die die jeweilige Abfrage zurückgibt: Das Verzeichnisattribut memberOf und die Beispiele zeigen direkte Gruppenverknüpfungen, keine vollständige Auflösung transitiver Mitgliedschaften. Die primäre Gruppe eines Benutzers ist darin möglicherweise ebenfalls nicht enthalten.

Gruppenmitgliedschaften eines Benutzers mit den älteren net-Befehlen abrufen

Mit net user /domain fragen Sie die Domäne nach Informationen zum angemeldeten Konto ab. Das Ergebnis enthält dessen globale Domänengruppen. Um ein anderes Domänenkonto abzufragen, geben Sie den Benutzernamen an: net user username /domain.

Dieses ältere Befehlszeilenprogramm lässt sich direkt aus PowerShell aufrufen; es ist kein PowerShell-Alias. Die Ausgabe ist für die Anzeige formatiert. Wenn Sie strukturierte Objekte benötigen oder Gruppennamen in einem Skript verarbeiten möchten, verwenden Sie daher eine Active-Directory-Abfrage. Der Befehl liefert Informationen zur Domäne, nicht zur Mitgliedschaft des Benutzers in lokalen Gruppen auf seinem Computer.

Gruppenmitgliedschaften eines Benutzers mit ADSI abrufen

ADSI ist eine Windows-Schnittstelle für Verzeichnisdienste, die über den Typ [adsisearcher] in PowerShell verfügbar ist. Diese Abfrage verwendet den Namen des angemeldeten Kontos und gibt dessen memberOf-Werte als Distinguished Names zurück. Führen Sie sie in einer mit der Domäne verbundenen PowerShell-Sitzung aus: $searcher = [adsisearcher]"(samAccountName=$($env:USERNAME))"; $result = $searcher.FindOne(); if ($null -ne $result) { $result.Properties.memberof }.

Jeder Wert bezeichnet eine Gruppe anhand ihres LDAP-Distinguished-Name einschließlich des organisatorischen Pfads. Der Filter richtet sich nach dem Kontonamen in $env:USERNAME; er wählt kein anderes Konto aus. memberOf steht für direkte Verknüpfungen und führt die primäre Gruppe nicht auf. Für diese Methode ist kein separates PowerShell-Modul nötig, aber sie erfordert weiterhin eine Verbindung zum Verzeichnis und Leseberechtigung für das Konto. Die Abfrage hängt davon ab, ob die jeweilige Umgebung Active Directory auflösen und durchsuchen kann; dieser Artikel liefert keine Laufzeitergebnisse aus einer Domäne, die das Gegenteil belegen würden.
Um aus beispielhaften Distinguished Names den Anteil des gemeinsamen Namens anzuzeigen, können Sie eine reguläre Ausdruckssuche auf die zurückgegebenen Zeichenfolgen anwenden:

$memberOf = @(
    "CN=Finance,OU=Groups,DC=example,DC=com",
    "CN=Engineering,OU=Groups,DC=example,DC=com"
)
$memberOf -replace '^CN=([^,]+).+$', '$1'
Finance
Engineering

Diese Umwandlung entfernt den LDAP-Pfad aus jeder übergebenen Zeichenfolge; sie führt keine Verzeichnisabfrage aus. Der reguläre Ausdruck setzt voraus, dass der gemeinsame Name kein maskiertes Komma enthält.

Gruppenmitgliedschaften eines Benutzers mit einem neuen Objekt abrufen

DirectorySearcher bietet eine weitere integrierte Möglichkeit, nach einem benannten Konto zu suchen. Dieses Beispiel akzeptiert bewusst nur einen ASCII-sAMAccountName aus Buchstaben, Ziffern, Punkten, Unterstrichen oder Bindestrichen und mit höchstens 20 Zeichen. Lehnen Sie alle anderen Eingaben ab, bevor Sie den LDAP-Filter erstellen: if ($username -notmatch '^[A-Za-z0-9._-]{1,20}$') { throw 'Use a valid account name.' }. Nach der Prüfung führen Sie Folgendes aus: $searcher = New-Object System.DirectoryServices.DirectorySearcher("(&(objectCategory=User)(samAccountName=$username))"); $result = $searcher.FindOne(); if ($null -ne $result) { $result.Properties.memberof }. Durch die eingeschränkte Zeichenmenge kann der übergebene Wert keine LDAP-Filtersyntax hinzufügen. Wenn Ihr Verzeichnis andere Kontonamen zulässt, müssen Sie stattdessen den Wert für einen LDAP-Filter maskieren.

Die zurückgegebenen Werte sind LDAP-Distinguished-Names und nicht bloß Gruppennamen. Ersetzen Sie user01 durch den Anmeldenamen des Zielkontos. Wie das ADSI-Beispiel liest diese Abfrage das Attribut memberOf; sie löst daher keine verschachtelten Mitgliedschaften auf und enthält nicht die primäre Gruppe. Sie benötigt Zugriff auf ein Domänenverzeichnis, aber keine separate Modulinstallation.

Gruppenmitgliedschaften eines Benutzers mit dem Active-Directory-Modul abrufen

Das Active-Directory-Modul enthält Cmdlets für die Verzeichnisverwaltung. Es muss bereits auf dem Computer verfügbar sein; Install-Module allein installiert dieses Windows-Modul nicht. Installieren Sie RSAT anhand der Microsoft-Anleitung für die verwendete Windows-Version. Dieser Artikel belegt weder versionsspezifische RSAT-Befehle noch Kompatibilität; deshalb ist hier kein solcher Befehl aufgeführt.

Active-Directory-Modul installieren

Importieren Sie nach der Installation der passenden RSAT-Komponente das Modul in die PowerShell-Sitzung: Import-Module -Name ActiveDirectory.

Ist das Modul nicht verfügbar, kann der Importbefehl es nicht laden. Die Installationsschritte unterscheiden sich je nach Windows-Version. Folgen Sie daher der aktuellen Microsoft-Anleitung für RSAT für diese Version, statt einen Befehl für eine andere Version zu übernehmen.

Das Cmdlet Get-ADPrincipalGroupMembership verwenden

Übergeben Sie Get-ADPrincipalGroupMembership den Kontonamen des Benutzers. Für eine kompakte Anzeige wählen Sie anschließend die Gruppennamen aus: Get-ADPrincipalGroupMembership -Identity "user01" | Select-Object -ExpandProperty Name.

Ersetzen Sie user01 durch die Identität des Zielkontos. Das Cmdlet gibt Gruppenobjekte für die diesem Prinzipal zugeordneten Gruppen zurück. Durch die Auswahl von Name werden deren Namen statt der LDAP-Distinguished-Names angezeigt. Der Befehl setzt das Active-Directory-Modul, eine geeignete Verbindung zum Verzeichnis und Leseberechtigung voraus. Für diese Beispiele liegen keine Ausführungsnachweise aus einer Windows-Domänenumgebung vor; ihre domänenabhängige Ausgabe und ihr Verhalten werden daher nicht als getestet dargestellt.