none
Auflistung der User einer AD Gruppe CSV export RRS feed

  • 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

    
    Mittwoch, 13. November 2013 11:44

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
    Mittwoch, 13. November 2013 15:01

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
    Mittwoch, 13. November 2013 15:01
  • 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

    Mittwoch, 13. November 2013 15:21
  • 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)

    Donnerstag, 14. November 2013 06:25
  • Hallo Peter,

    Okey ich glaube ich habs verstanden. Ich hätte da noch eine Frage gilt den das gleiche auch wenn ich lokale Gruppen remote auslesen will?

    ps: dein youtube kanal ist echt super!

    Gruss

    Psy

    Freitag, 15. November 2013 07:21
  • 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)

    Freitag, 15. November 2013 10:03