Powershell - auslesen von usern in multiplen gruppen
Hallo zusammen,
erstmal zum Szenario.
Wir haben ca. 300 User und eine MailSignatur Verwaltung. Durch unsere Signatur Verwaltungen haben wir ca. 10 verschiedene Signatur Gruppen.
Wir müssen jeden neuen User per Hand Sortieren in welche Gruppe er gehört. Leider ist es häufig vorgekommen das durch verschieben usw. Dieser User in zwei verschiedenen Signatur Gruppen gelandet ist. Was zu massiven crashes führt.
Ich bräuchte in kleines Skript wo mir meinetwegen alle User aus den 10 Gruppe ausliest und WENN ein user in 2 von diesen 10 Gruppen ist mir diesen ausgibt.
Ich habe bereits einiges probiert aber meine PS skills lassen zu wünschen übrig. Habt ihr zufällig schon mal so einen Fall gehabt und hierzu ein Skript?
Ich wäre auch sehr dankbar.
Grüße,
erstmal zum Szenario.
Wir haben ca. 300 User und eine MailSignatur Verwaltung. Durch unsere Signatur Verwaltungen haben wir ca. 10 verschiedene Signatur Gruppen.
Wir müssen jeden neuen User per Hand Sortieren in welche Gruppe er gehört. Leider ist es häufig vorgekommen das durch verschieben usw. Dieser User in zwei verschiedenen Signatur Gruppen gelandet ist. Was zu massiven crashes führt.
Ich bräuchte in kleines Skript wo mir meinetwegen alle User aus den 10 Gruppe ausliest und WENN ein user in 2 von diesen 10 Gruppen ist mir diesen ausgibt.
Ich habe bereits einiges probiert aber meine PS skills lassen zu wünschen übrig. Habt ihr zufällig schon mal so einen Fall gehabt und hierzu ein Skript?
Ich wäre auch sehr dankbar.
Grüße,
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 384375
Url: https://administrator.de/forum/powershell-auslesen-von-usern-in-multiplen-gruppen-384375.html
Ausgedruckt am: 29.04.2025 um 18:04 Uhr
5 Kommentare
Neuester Kommentar
Servus @Izedra1996 , willkommen auf Administrator.de!
Da gibt es wie immer mehrere Wege nach Rom. Da heute Samstag ist, hier mal zwei ausführlich beschriebene Varianten wie du diese Aufgabe lösen kannst:
Vorgehensweise des Einzeilers ist dabei folgende: Ein Array aus den Gruppennamen wird an eine Foreach-Schleife (%{}) übergeben, mit dem CMDLet Get-ADGroupMember holt sich die Schleife alle Mitglieder der Gruppen, welche dann an das CMDLet Group-object übergeben wird welches die Mitglieder nach dem SamAccountName gruppiert, also alle doppelten Namen zu einem Gruppeneintrag zusammenfasst. Dieses Gruppenergebnis enthält die Eigenschaft Count welche die Anzahl der Namen in der jeweiligen Gruppe enthält also alle doppelt vorhandenen Namen, die durch ein Where-Object (?{}) ausgefiltert werden und zum Schluss durch ein Select ausgegeben werden.
Vorgehensweise des Einzeilers ist dabei folgende: Es werden alle Mitglied der Gruppen aus dem AD geholt und in der Pipe an ein where-object übergeben welches die User ausfiltert. Der Filter besteht aus dem CMDLet Compare-Object welches zwei Arrays vergleicht (in dem Fall die Namen aller Gruppen des jeweiligen Users und einer vordefinierten Liste mit deinen Gruppen). Durch die Kombination der Parameter -IncludeEqual und -ExcludeDifferent von Compare-Object gibt es nur übereinstimmende Objekte beider Arrays aus. Sollte also ein User in mehreren deiner Gruppen Mitglied sein dann wird Compare-Object auch diese Anzahl zurückgeben, und genau diese Anzahl (Count) wird hier im Where-Object auf > 1 geprüft. Die Ausgabe ist am Ende wieder ein oder mehrere AD-Objekte der User welche in mehreren Gruppen Mitglied sind, davon wird hier im Beispiel wieder der SamAccountName selektiert/ausgegeben.
Das du die Gruppennamen in den Arrays anpassen musst ist natürlich verpflichtend.
Hoffe das war soweit verständlich. Das Spiel lässt sich beliebig in anderen Varianten weiterführen, z.B. über Vergleich der MemberOf Eigenschaft der ADUser usw. Essentiell bei der Entwicklung ist einfach das man sich mal die Eigenschaften der Objekte in der Pipeline ansieht dann versteht man es alles auch besser.
Wünsche weiterhin viel Spaß beim jonglieren mit der Powershell.
Grüße Uwe
Da gibt es wie immer mehrere Wege nach Rom. Da heute Samstag ist, hier mal zwei ausführlich beschriebene Varianten wie du diese Aufgabe lösen kannst:
Variante 1 (schneller)
Vorgehensweise des Einzeilers ist dabei folgende: Ein Array aus den Gruppennamen wird an eine Foreach-Schleife (%{}) übergeben, mit dem CMDLet Get-ADGroupMember holt sich die Schleife alle Mitglieder der Gruppen, welche dann an das CMDLet Group-object übergeben wird welches die Mitglieder nach dem SamAccountName gruppiert, also alle doppelten Namen zu einem Gruppeneintrag zusammenfasst. Dieses Gruppenergebnis enthält die Eigenschaft Count welche die Anzahl der Namen in der jeweiligen Gruppe enthält also alle doppelt vorhandenen Namen, die durch ein Where-Object (?{}) ausgefiltert werden und zum Schluss durch ein Select ausgegeben werden.'Gruppe1','Gruppe2','GruppeN' | %{Get-ADGroupMember $_ -Recursive} | group SamAccountName | ?{$_.Count -gt 1} | select Name
Variante 2
Vorgehensweise des Einzeilers ist dabei folgende: Es werden alle Mitglied der Gruppen aus dem AD geholt und in der Pipe an ein where-object übergeben welches die User ausfiltert. Der Filter besteht aus dem CMDLet Compare-Object welches zwei Arrays vergleicht (in dem Fall die Namen aller Gruppen des jeweiligen Users und einer vordefinierten Liste mit deinen Gruppen). Durch die Kombination der Parameter -IncludeEqual und -ExcludeDifferent von Compare-Object gibt es nur übereinstimmende Objekte beider Arrays aus. Sollte also ein User in mehreren deiner Gruppen Mitglied sein dann wird Compare-Object auch diese Anzahl zurückgeben, und genau diese Anzahl (Count) wird hier im Where-Object auf > 1 geprüft. Die Ausgabe ist am Ende wieder ein oder mehrere AD-Objekte der User welche in mehreren Gruppen Mitglied sind, davon wird hier im Beispiel wieder der SamAccountName selektiert/ausgegeben.$groups = 'Gruppe1','Gruppe2','GruppeN'
$groups | %{Get-ADGroupMember $_ -Recursive} | select -Unique | ?{(compare (Get-ADPrincipalGroupMembership $_.SamAccountName).Name $groups -IncludeEqual -ExcludeDifferent).Count -gt 1} | select SamAccountName
Hoffe das war soweit verständlich. Das Spiel lässt sich beliebig in anderen Varianten weiterführen, z.B. über Vergleich der MemberOf Eigenschaft der ADUser usw. Essentiell bei der Entwicklung ist einfach das man sich mal die Eigenschaften der Objekte in der Pipeline ansieht dann versteht man es alles auch besser.
Wünsche weiterhin viel Spaß beim jonglieren mit der Powershell.
Grüße Uwe
Zitat von @Izedra1996:
Soweit läuft das Skript durch und greift auf die richtige OU zu, jedoch sehe ich keine Ausgabe.
Dann gibt es keinen User der in mind 2 Gruppen ist ganz einfach Soweit läuft das Skript durch und greift auf die richtige OU zu, jedoch sehe ich keine Ausgabe.
Ich habe Test weise mit 3 Gruppen geprüft.
einmal mit einem doppelten User und einmal ohne Doppelte ich bekomme jedoch keine Rückmeldung/Ausgabe in der ISE.
Häng doch einfach mal ein Format-Table oder Format-List an die Pipe (Dazu solltest du ja hoffentlich in der Lage sein), denn select ist ja erst mal an sich kein Ausgabe-CMDLet, es hat zwar eine Default-Ausgabe aber die bestimmt deine Shell und mit den Format cmdlets erzeugst du explizit eine erzwungene Ausgabe im jeweiligen Format.einmal mit einem doppelten User und einmal ohne Doppelte ich bekomme jedoch keine Rückmeldung/Ausgabe in der ISE.
Scripte wurden einwandfrei getestet. Es liegt also offensichtlich an deiner Nutzungsweise/Anpassung.
Du bist mir ein Witzbold, ohne Fehlermeldung und deine Anpassungen und Angaben zur Umgebung können wir hier nichts für dich tun, es funktioniert einwandfrei, mache ich ja schon eh und jeh und das ist nun wirklich keine schwierige Aufgabe, sorry.
Guckst du wen du es immer noch nicht glaubst, zwei Gruppen nur ein User ist doppelt (mmuster) in zwei Gruppen vorhanden und dieser wird auch so wie du es wolltest ausgegeben:
Guckst du wen du es immer noch nicht glaubst, zwei Gruppen nur ein User ist doppelt (mmuster) in zwei Gruppen vorhanden und dieser wird auch so wie du es wolltest ausgegeben: