Benutzer mit den meisten Antworten
Auflistung der User einer AD Gruppe CSV export

Frage
-
Hallo Zusammen,
Ich bin neu im Script bereich und habe angefangen mit Powershell herum zu scripten und bräuchte eure Hilfe.
Habe ein Script das aus einem csv File die jeweiligen Gruppen herausliest und dann die User der Gruppe in ein weiteres csv file exportiert. Dies Funktioniert soweit auch ganz gut. Jedoch ist nun das Problem das beim Export nicht ersichtlich ist welche user zu Welcher Gruppe gehört.
Hier mein Script:
Import-Module ActiveDirectory $csv = Get-Content "c:\Temp\group.csv" $result = $csv | foreach-object { $group=$_ get-adgroupmember "$_" -recursive | % { $group=$_ get-aduser $_ -Properties Employeeid | select @{n="Group";e={$group}},Name,SurName,GivenName,Employeeid } } $result | export-csv c:\temp\groupandmem.csv -notypeinformation
Danke schonmal für eure unterstützung
Gruss
Antworten
-
Das geht nur mit einer Rekursiven Funktion.
Da das Active Directory aber zirkelbezüge unterstützt, muss man diese in der Rekursion verhindern, sonnst läuft die Rekursion ewig.Dies mache ich mit einem Statischen Array:
Function Get-ADNestedGroupMembersWithGroup { # Funktion um rekursiv alle user aus einer Gruppe zu holen mit # Angabe der Gruppe in der Sie gefunden wurden [cmdletbinding()] param ( [Parameter(Mandatory=$True)] [String]$GroupName, [String[]]$Properties ) Begin { Function Internal { [cmdletbinding()] param ( [String]$GroupName, [String[]]$Properties ) # den Gruppen Namen zum Array zufügen, damit die Gruppe nicht nochmal besucht wird (Zirkelbezug) If(-not($StaticInternalArray -contains $GroupName)){ $StaticInternalArray += $GroupName } # die Gruppen Member (nicht rekursiv) auslesen. Die Rekursion übernimmt unsere Funktion! Get-ADGroupMember -Identity $GroupName | ForEach-Object { # Wenn der Gruppen Member eine Gruppe ist wird die Funktion Rekursiv aufgerufen If($_.ObjectClass -eq "group") { If(-not ($StaticInternalArray -contains $_.Name)) { Internal $_.Name } } else { # Gruppen Member ist ein User # wenn Properties angegeben wurden, wird der user mit den Properties ausgelesen If(-not [String]::IsNullOrEmpty($Properties)) { $User = Get-ADUser $_ -Properties $Properties } Else { # wenn KEINE Properties angegeben wurden, wird der user normal ausgelesen $User = Get-ADUser $_ } # das GroupName Property an das user Objekt anhängen # in dieser Gruppe haben wir den user gefunden # da Gruppen umbenannt werden können, müsste hier korrekter weise, noch die Gruppen GUID angehängt werden (das spare ich mir hier) Add-Member -MemberType NoteProperty -Name 'GroupName' -Value $GroupName -InputObject $User -Force $User } } } # ende Internal Function } # ende vom begin Block Process { # Das Active Directory Module von Microsoft muss geladen sein If(-not (Get-Module ActiveDirectory)) { Import-Module ActiveDirectory } # Statisches Array deklarieren um Zirklebezüge des Active Directorys zu verhindern # hier werden Gruppen Namen angelegt die schon besucht wurden New-Variable -Name StaticInternalArray -Value @() -Option "AllScope" # interne Rekursive Funktion aufrufen Internal -GroupName $GroupName -Properties $Properties } End { # leer hier nich war !? ;-) } } # Beispiel Aufruf der Funktion Get-ADNestedGroupMembersWithGroup -GroupName "Start-Gruppen-Name-Hier" -Properties Employeeid
Meine PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
Mein deutscher PowerShell Blog
Mein 21 Teiliger PowerShell Video Grundlehrgang
Deutsche PowerShell Videos auf Youtube
Folge mir auf:
Twitter | Facebook | Google+ | Deutsches PowerShell Forum (TechNet)- Bearbeitet Peter Kriegel Donnerstag, 14. November 2013 06:17
- Als Antwort markiert Psyclos Freitag, 15. November 2013 07:22
Alle Antworten
-
Das geht nur mit einer Rekursiven Funktion.
Da das Active Directory aber zirkelbezüge unterstützt, muss man diese in der Rekursion verhindern, sonnst läuft die Rekursion ewig.Dies mache ich mit einem Statischen Array:
Function Get-ADNestedGroupMembersWithGroup { # Funktion um rekursiv alle user aus einer Gruppe zu holen mit # Angabe der Gruppe in der Sie gefunden wurden [cmdletbinding()] param ( [Parameter(Mandatory=$True)] [String]$GroupName, [String[]]$Properties ) Begin { Function Internal { [cmdletbinding()] param ( [String]$GroupName, [String[]]$Properties ) # den Gruppen Namen zum Array zufügen, damit die Gruppe nicht nochmal besucht wird (Zirkelbezug) If(-not($StaticInternalArray -contains $GroupName)){ $StaticInternalArray += $GroupName } # die Gruppen Member (nicht rekursiv) auslesen. Die Rekursion übernimmt unsere Funktion! Get-ADGroupMember -Identity $GroupName | ForEach-Object { # Wenn der Gruppen Member eine Gruppe ist wird die Funktion Rekursiv aufgerufen If($_.ObjectClass -eq "group") { If(-not ($StaticInternalArray -contains $_.Name)) { Internal $_.Name } } else { # Gruppen Member ist ein User # wenn Properties angegeben wurden, wird der user mit den Properties ausgelesen If(-not [String]::IsNullOrEmpty($Properties)) { $User = Get-ADUser $_ -Properties $Properties } Else { # wenn KEINE Properties angegeben wurden, wird der user normal ausgelesen $User = Get-ADUser $_ } # das GroupName Property an das user Objekt anhängen # in dieser Gruppe haben wir den user gefunden # da Gruppen umbenannt werden können, müsste hier korrekter weise, noch die Gruppen GUID angehängt werden (das spare ich mir hier) Add-Member -MemberType NoteProperty -Name 'GroupName' -Value $GroupName -InputObject $User -Force $User } } } # ende Internal Function } # ende vom begin Block Process { # Das Active Directory Module von Microsoft muss geladen sein If(-not (Get-Module ActiveDirectory)) { Import-Module ActiveDirectory } # Statisches Array deklarieren um Zirklebezüge des Active Directorys zu verhindern # hier werden Gruppen Namen angelegt die schon besucht wurden New-Variable -Name StaticInternalArray -Value @() -Option "AllScope" # interne Rekursive Funktion aufrufen Internal -GroupName $GroupName -Properties $Properties } End { # leer hier nich war !? ;-) } } # Beispiel Aufruf der Funktion Get-ADNestedGroupMembersWithGroup -GroupName "Start-Gruppen-Name-Hier" -Properties Employeeid
Meine PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
Mein deutscher PowerShell Blog
Mein 21 Teiliger PowerShell Video Grundlehrgang
Deutsche PowerShell Videos auf Youtube
Folge mir auf:
Twitter | Facebook | Google+ | Deutsches PowerShell Forum (TechNet)- Bearbeitet Peter Kriegel Donnerstag, 14. November 2013 06:17
- Als Antwort markiert Psyclos Freitag, 15. November 2013 07:22
-
Hallo Peter,
Danke für deine Antwort, obwohl ich sagen muss das ich den Code noch nicht ganz verstehe ( werde ihn heute abend nochmals genauer anschauen). Bin ein absoluter neuling was coden angeht.
Daher vielleicht eine andere Frage gibt es eine Möglichkeit bei meinem Code for der Schlaufe zu sagen das er jeweils eine Leere zeile hinzufügt. Dies würde mir schon reichen damit ich sehe welche User zu welcher Gruppe dazugehört.
Danke nochmals
-
Daher vielleicht eine andere Frage gibt es eine Möglichkeit bei meinem Code for der Schlaufe zu sagen das er jeweils eine Leere zeile hinzufügt.
Nein!
Wenn du Get-ADGroupmember recursive benutzt hast du keinen Einfluss oder Eingriffsmöglichkeiten auf die Rekursion und das auslesen der User.
Du bekommst nur eindeutige User zurück alle Gruppen Informationen gehen verloren.
Wenn alle Gruppen Informationen verloren sind, woher willst du dann wissen, wann du eine Leerzeile setzen musst ?
Meine PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
Mein deutscher PowerShell Blog
Mein 21 Teiliger PowerShell Video Grundlehrgang
Deutsche PowerShell Videos auf Youtube
Folge mir auf:
Twitter | Facebook | Google+ | Deutsches PowerShell Forum (TechNet) -
Ich hätte da noch eine Frage, gilt den das gleiche auch wenn ich lokale Gruppen remote auslesen will?
Soweit ich weiss kannst du Lokale Gruppen nicht mit dem Cmdlets von Microsoft auslesen. Hier musst du den den WinNT: Provider oder WMI Nutzen. Da läuft der Hase ganz anders und du musst die Rekursion immer selbst entwickeln (so wie ich) Siehe:
http://powershell-tools.de/lokale-administratoren-eines-computers-herausfinden/
ps: dein youtube kanal ist echt super!
Danke ! Lob ist mein Treibstoff ;-))
Meine PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
Mein deutscher PowerShell Blog
Mein 21 Teiliger PowerShell Video Grundlehrgang
Deutsche PowerShell Videos auf Youtube
Folge mir auf:
Twitter | Facebook | Google+ | Deutsches PowerShell Forum (TechNet)