Die Powershell-Funktion „IsMember“ überprüft, ob der Skript-ausführende Anwender Mitglied einer Gruppe ist. Dies hat Vorteile gegenüber der ADSI-Variante.
Index
PowerShell-Funktion: IsMember
Die Funktion „IsMember“ wertet den User Token aus, der bei der Anmeldung vom System generiert wird. Hierzu werden die Gruppen-SIDs aus dem Access-Token des angemeldeten Anwenders ermittelt und mit der übergebenen Gruppe/SID abgeglichen. Bei einer Übereinstimmung wird der Wert „True“ zurückgegeben. Um eine Abfrage nach Gruppen mit „IsMember“ durchzuführen, wird einfach der Gruppenname übergeben.
Die IsMember-Abfrage nach Gruppe „WordUser“:
1 |
IsMember(WordUser) |
Es gibt fest definierte Gruppen, bei denen der Gruppenname vom Betriebssystem abhängt. Die Gruppe der lokalen Administratoren heißt auf Deutsch „Administratoren“ und auf Englisch „Administrators“. In diesem Fall ist es sinnvoll, die SIDs der Gruppe zu verwenden. In diesem Fall wird der Parameter „–GroupSID“ angehangen. Microsoft stellt eine Liste vordefinierter SIDs zur Verfügung.
Die IsMember-Abfrage nach „GroupSID“:
1 |
IsMember –GroupSID “X-X-XX-XXX" |
Vorteil gegenüber ADSI Abfrage
Im User Token sind die SIDs von allen lokalen Gruppen und allen Domänengruppen enthalten, in denen der Anwender Mitglied ist. Ein großer Vorteil gegenüber einer ADSI-Abfrage ist, dass nicht jedes Mal ein Domain Controller kontaktiert werden muss. In Skripten mit vielen Gruppenabfragen (z.B. Logon-Skripte) wird die Verarbeitung auf diese Weise beschleunigt.
Mit dieser Funktion können lokale und Domänen-Gruppen abgefragt werden.
Skript als Admin starten
Zusätzlich zur Gruppenmitgliedschaft kann mit dieser Funktion überprüft werden, ob das Skript mit lokalen Administrationsrechten gestartet worden ist. Ist die Benutzerkontensteuerung eingeschalten und der Anwender in der lokalen Administratorengruppe, wird nicht automatisch die SID der lokalen Administratorengruppe dem Access-Token hinzugefügt. Die SID befindet sich nur im Token, wenn der Anwender das Programm/Skript über „Als Administrator ausführen“ gestartet hat.
Bei vordefinierten Gruppen, wie z.B. bei der lokalen Administratorengruppe, sollte man anstelle des Namens die SID (in diesem Fall „S-1-5-32-544“) nutzen. Dadurch ist man von der Sprache des Betriebssystems unabhängig:
1 2 3 4 5 |
If (!(IsMember -GroupSID "S-1-5-32-544")) { # Error auslösen Throw "Das Skript muss mit administrativen Berechtigungen gestartet werden!" } |
Vollständiges IsMember-Skript:
Gruppenmitgliedschaft des Benutzers prüfen
Hier nun das vollständige Skript für die PowerShell-Funktion „IsMember“:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
############################################################################################################################### # Function: IsMember # ------------------ # Aufgabe: Überprüft ob der Benutzer Mitglied in einer Gruppe ist # Übergabeparameter: Group; Gruppe # Domain; Domäne (Wird keine Domäne angegeben, dann wird die Umgebungsvariable "USERDOMAIN" verwendet) # SID; Anstelle einer Gruppe kann eine SID im String-Format angegeben werden # Rückgabewerte: True; Anwender ist Mitglied # False; Anwender ist nicht Mitglied ############################################################################################################################### function IsMember { #Übergabeparameter param( [String]$Group = "", [String]$Domain=$Env:USERDOMAIN, [String]$GroupSID = "" ) # Keine SID If($GroupSID -eq "") { If($Domain -like $env:COMPUTERNAME) { $NtSecurityPrincipal = New-Object System.Security.Principal.NTAccount($Group) } Else { $NtSecurityPrincipal = New-Object System.Security.Principal.NTAccount($Domain, $Group) } $GroupSID = ($NtSecurityPrincipal.Translate([System.Security.Principal.SecurityIdentifier])).Value } # SID mit SIDs im Token vergleichen $Token = [System.Security.Principal.WindowsIdentity]::GetCurrent() $GroupSIDs = $Token.Groups ForEach($Sid in $GroupSIDs) { # Ist Mitglied If($Sid -eq $GroupSID) {Return $True} } # Kein Mitglied der Gruppe Return $False } |
Beispiele für IsMember
Ich habe das PowerShell-Skript vervollständigt und Kommentare ergänzt. Es beinhaltet 3 Beispiele:
- Prüfung, ob der Skript ausführende User als Admin angemeldet ist
(siehe oben „Skript als Admin starten“)
- Prüfung, ob der Anwender Mitglied in der Gruppe „Domänen-Benutzer“ ist
123456789# Abfrage ob der Anwender Mitglied in der Gruppe "Domänen-Benutzer" istIf(IsMember("Domänen-Benutzer")){Write-Host("Anwender ist Mitglied")}Else{Write-Host("Anwender ist kein Mitglied")} - Prüfung, ob der Anwender Mitglied in der Gruppe „Domänen-Benutzer“ in der Domäne „FirstAttribute“ ist
123456789# Abfrage ob der Anwender Mitglied in der Gruppe "Domänen-Benutzer" in der Domäne "FirstAttribute" istIf(IsMember("Domänen-Benutzer") -Domain "FirstAttribute"){Write-Host("Anwender ist Mitglied")}Else{Write-Host("Anwender ist kein Mitglied")}
Wie viele Gruppenmitgliedschaften haben meine AD Benutzer?
Mit kostenlosem Tool auslesen – ohne PowerShell!
Oft reicht es, bereits zu wissen, wie viele Gruppenmitgliedschaften ein User hat. Mit unserem kostenfreien Werkzeug FirstWare AD-Inspector lassen sich Gruppenmitgliedschaften einzelner User bequem anzeigen. Einen Einstieg zum Tool gibt Steve im Beitrag Active Directory Reporting einfach gemacht.
Anzahl Gruppen auslesen – pro User und OU
Die Analyse der Gruppenmitgliedschaften liefert Ihnen zwei Informationen zurück. Zum einen bekommen Sie aufgelistet, in wie vielen Gruppen Ihr Benutzerobjekt direktes Mitglied ist. Zum anderen bekommen Sie aufgelistet, in wie vielen geschachtelten Gruppen („TokenGroups“) das Benutzerobjekt indirekt Mitglied ist.
Die Software kann auf unserer Webseite heruntergeladen werden. Sie finden außerdem detaillierte Erklärungen zu 17 verschiedenen Analysen:
1 Comment
Leave your reply.