izedra1996
Goto Top

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,

Content-Key: 384375

Url: https://administrator.de/contentid/384375

Printed on: April 26, 2024 at 06:04 o'clock

Member: colinardo
colinardo Aug 25, 2018 updated at 08:19:05 (UTC)
Goto Top
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:
back-to-topVariante 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  
back-to-topVariante 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
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
Member: Izedra1996
Izedra1996 Aug 25, 2018 at 22:30:04 (UTC)
Goto Top
Hey,

vielen Dank für deine schnelle und ausführliche Rückmeldung.

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.

Grüße,
Member: colinardo
colinardo Aug 26, 2018 updated at 06:03:49 (UTC)
Goto Top
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 face-smile, es gibt nur bei doppelten Werten die User aus, gibt es keine gibt es auch 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.

Scripte wurden einwandfrei getestet. Es liegt also offensichtlich an deiner Nutzungsweise/Anpassung.
Member: Izedra1996
Izedra1996 Aug 26, 2018 at 09:49:16 (UTC)
Goto Top
Ich habe gerade ein wenig rumprobiert.
Somit bin ichhierzu nicht in der Lage, da mir dabei das Skript Crasht.
Member: colinardo
colinardo Aug 26, 2018 updated at 15:01:04 (UTC)
Goto Top
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:

screenshot