none
AD - Gruppenabfrage RRS feed

  • Frage

  • Hallo liebe Powershell Gemeinde,

    ich beschäftige mich seit einiger Zeit mit PowerShell. Bin aber noch absoluter Anfänger. Somit hoffe ich auf eure Hilfe und Unterstützung. Mein Proble ist folgendes:

    Ich soll zusammen stellen, welcher Anwender ist in welchen AD Gruppen. Es sollen alle AD Gruppen erfasst werden. Das Ergebniss soll dann in eine .csv oder .xls Datei geschrieben werden. Auf diesem Wege soll überprüft werden ob der Anwender xy zuviele Rechte hat. Diese Überprüfung soll dann z.B alle 3 -6 Monate erfolgen.

    Ich habe dies bereits für eine einzelen Gruppe gemacht und das Ergebniss in eine .txt Datei geschrieben.

    Get-ADGroupMember "....." | Get-ADUser | Where-Object { $_.Enabled -eq 'True' } |ft name > c:\Ausgabe\****.txt

    Das habe ich auch versucht aber ich weiss nicht wie ich das aufbereiten soll?

    Import-Module ActiveDirectory
    get-adgroup -filter * -Properties member

    Sind die Ansätze den schon so weit gut oder bin ich auf dem total falschen Weg? Ich hoffe ihr könnt mir helfen.

    Viele Grüße

    Michael


    Donnerstag, 25. Juni 2015 08:08

Antworten

  • Hallo, dein Ansatz ist gut und geht in die richtige Richtung.

    Ich habe dir mal einen Ansatz geschrieben, wie ich die Sache lösen würden.

    Da Gruppen immer einen eindeutigen Namen habe selectiere ich bei get-adgroup immer nach Namen um den Overhead zu minimieren. Im weiteren geht das Skript einfach durch alle Gruppen und sucht die Nutzer.

    Beim Export der csv entferne ich noch die Typinformationen um gleich in Excel mit der Arbeit zu beginnen und du kannst da gleich deine Filter anwenden.

    Import-Module ActiveDirectory
    
    $allGroups = Get-ADGroup -filter * | SELECT name 
    
    $Members = foreach ($Group in $allGroups)
    {
     Get-ADGroupMember -Identity $Group.name | select Name , @{Name="Gruppe";Expression={$Group.name}}
     }
    
     $Members | Export-Csv C:\TMP\member.csv -NoTypeInformation -Delimiter ";" 

    Das ist noch eine weitere Möglichkeit, hier wird erst der Nutzer gesucht und dann die entsprechende Gruppenmitgliedschaft aufgelöst.

    Da Memberof immer den kompletten distinguishedname zurückgibt, muss man etwas mit substring spielen. Alternativ musst du nach der Gruppe Suchen und dann nur Name Selektieren.

    $AllUsers= get-aduser -Filter * -Properties memberof |select name, memberof
    
    $Gruppen = foreach ($Nutzer in $AllUsers){
    
    foreach ($Group in $Nutzer.memberof){
    
    
            $Gruppe = ($Group -split ",")[0].Substring(3)
    
            $hash = @{ Gruppe = $Gruppe
                        Nutzer = $Nutzer.Name}
            New-Object PSObject -Property $hash
    }
               
    
    }
    
    $Gruppen | Export-Csv -NoTypeInformation -Delimiter ";" -Path C:\TMP\Member.csv

    Viele Grüße


    Donnerstag, 25. Juni 2015 09:45
  • Nein, es werden alle AD Gruppen genommen. In der Funktion Get-ADGroup gibt es den Parameter Filter. Wenn du keinen AD Nutzer oder eine AD Gruppe direkt ansprichst, musst du -Filter belegen. Entweder du gibst eine Filtersyntax ein, oder du nimmst * um dir alle Gruppen anzeigen zu lassen. Schau dir dazu mal die Beispiele (Get-Help Get-ADGroup -Examples) an. Dort findest du einige Beispiele mit Filter.

    Der Parameter Name bezieht sich auf die Funktion Select in der Pipeline. Nachdem alle AD Objekte gefunden wurden, wird von diesen nur der Name genommen und damit weitergearbeitet. Wenn du eine große Umgebung hast, würdest du jedes AD Objekt mit all sein Eigenschaften  in die Variable $allGroups oder $allUser schreiben. Das hat zur Folge, dass es dein Skript aufbläht und langsam macht, da du nur die Name Information benötigst. Es ist am besten sich von Anfang an nur die Parameter anzeigen zu lassen, die auch wirklich benötigt werden. Am einfachsten über Select, da suchst du dir einfach die Eigenschaften raus, die du brauchst.  in diesem Fall ist das der Parameter Name.

    Am Ende hast du eine Tabelle die Folgendermaßen aussieht:

    Für das Erste Skript:

    1  Gruppe1 Mitglied1
    2  Gruppe1 Mitglied2
    3  Gruppe1 Mitglied3
    4  Gruppe2 Mitglied1
    5  Gruppe2 Mitglied4

    ....

    Für das zweite Skript sieht die Tabelle so aus:

    1  Gruppe1 Mitglied1
    2  Gruppe2 Mitglied1
    3  Gruppe3 Mitglied1

    • Als Antwort markiert Better_M Montag, 29. Juni 2015 05:27
    Donnerstag, 25. Juni 2015 12:05
  • Hast du bei der Nutzerabfrage die Eigenschaft samAccountName mit ausgewählt ?

    $AllUsers= Get-ADUser -Filter * -Properties Memberof | select Name, Memberof, SamaAccountName

    Bei solchen Abfragen musst du immer schauen, welche Eigenschaften du brauchst. Nehm dir mal einen AD Nutzer und schau dir die Ausgaben von den Befehlen an.

    Get-ADUser -Identity <Nutzername>

    Get-ADUser -Identity <Nutzername> -Properties *

    Get-ADUser -Identity <Nutzername> -Properties Memberof, Created

    Get-ADUser -Identity <Nutzername> -Properties Memberof, Created | select Name, Created, MemberOf | fl

    Grüße Andy


    • Bearbeitet Andreas Bittner Freitag, 26. Juni 2015 08:11
    • Als Antwort markiert Better_M Montag, 29. Juni 2015 05:26
    Freitag, 26. Juni 2015 08:11

Alle Antworten

  • Hallo, dein Ansatz ist gut und geht in die richtige Richtung.

    Ich habe dir mal einen Ansatz geschrieben, wie ich die Sache lösen würden.

    Da Gruppen immer einen eindeutigen Namen habe selectiere ich bei get-adgroup immer nach Namen um den Overhead zu minimieren. Im weiteren geht das Skript einfach durch alle Gruppen und sucht die Nutzer.

    Beim Export der csv entferne ich noch die Typinformationen um gleich in Excel mit der Arbeit zu beginnen und du kannst da gleich deine Filter anwenden.

    Import-Module ActiveDirectory
    
    $allGroups = Get-ADGroup -filter * | SELECT name 
    
    $Members = foreach ($Group in $allGroups)
    {
     Get-ADGroupMember -Identity $Group.name | select Name , @{Name="Gruppe";Expression={$Group.name}}
     }
    
     $Members | Export-Csv C:\TMP\member.csv -NoTypeInformation -Delimiter ";" 

    Das ist noch eine weitere Möglichkeit, hier wird erst der Nutzer gesucht und dann die entsprechende Gruppenmitgliedschaft aufgelöst.

    Da Memberof immer den kompletten distinguishedname zurückgibt, muss man etwas mit substring spielen. Alternativ musst du nach der Gruppe Suchen und dann nur Name Selektieren.

    $AllUsers= get-aduser -Filter * -Properties memberof |select name, memberof
    
    $Gruppen = foreach ($Nutzer in $AllUsers){
    
    foreach ($Group in $Nutzer.memberof){
    
    
            $Gruppe = ($Group -split ",")[0].Substring(3)
    
            $hash = @{ Gruppe = $Gruppe
                        Nutzer = $Nutzer.Name}
            New-Object PSObject -Property $hash
    }
               
    
    }
    
    $Gruppen | Export-Csv -NoTypeInformation -Delimiter ";" -Path C:\TMP\Member.csv

    Viele Grüße


    Donnerstag, 25. Juni 2015 09:45
  • Danke für die schnelle Antwort. Zwei Fragen habe ich noch.

    1. Sehe ich das richtig das ich die Abfrage dann jede unser ca. 200 Gruppen machen muss?

    Ich dachte ich habe nachher eine Datei in der alle Infos stehen. Also Anwender XY ist in Gruppe AB, CD EF ...

    2. Soll der Wert name durch den Namen der Gruppe ersetzt werden?

    Sorry für die Rückfragen aber wie gesagt das ist noch etwas neu für mich. Ich fange gerade erst an zu scripten.

    Viele Grüße

    Michael

    Donnerstag, 25. Juni 2015 11:08
  • Sorry, das zweite Script mach genau das was ich haben wollte.

    Vielen Danke

    Donnerstag, 25. Juni 2015 11:23
  • Nein, es werden alle AD Gruppen genommen. In der Funktion Get-ADGroup gibt es den Parameter Filter. Wenn du keinen AD Nutzer oder eine AD Gruppe direkt ansprichst, musst du -Filter belegen. Entweder du gibst eine Filtersyntax ein, oder du nimmst * um dir alle Gruppen anzeigen zu lassen. Schau dir dazu mal die Beispiele (Get-Help Get-ADGroup -Examples) an. Dort findest du einige Beispiele mit Filter.

    Der Parameter Name bezieht sich auf die Funktion Select in der Pipeline. Nachdem alle AD Objekte gefunden wurden, wird von diesen nur der Name genommen und damit weitergearbeitet. Wenn du eine große Umgebung hast, würdest du jedes AD Objekt mit all sein Eigenschaften  in die Variable $allGroups oder $allUser schreiben. Das hat zur Folge, dass es dein Skript aufbläht und langsam macht, da du nur die Name Information benötigst. Es ist am besten sich von Anfang an nur die Parameter anzeigen zu lassen, die auch wirklich benötigt werden. Am einfachsten über Select, da suchst du dir einfach die Eigenschaften raus, die du brauchst.  in diesem Fall ist das der Parameter Name.

    Am Ende hast du eine Tabelle die Folgendermaßen aussieht:

    Für das Erste Skript:

    1  Gruppe1 Mitglied1
    2  Gruppe1 Mitglied2
    3  Gruppe1 Mitglied3
    4  Gruppe2 Mitglied1
    5  Gruppe2 Mitglied4

    ....

    Für das zweite Skript sieht die Tabelle so aus:

    1  Gruppe1 Mitglied1
    2  Gruppe2 Mitglied1
    3  Gruppe3 Mitglied1

    • Als Antwort markiert Better_M Montag, 29. Juni 2015 05:27
    Donnerstag, 25. Juni 2015 12:05
  • Okay. Ich glaube das habe ich jetzt verstanden. Denn das zweite Script macht genau das was ich erreichen wollte.

    Daher habe ich Dein Script erweitert, jedoch wird das zusätzliche Feld in Excel nicht gefüllt, warum?

    Was habe ich falsch gemacht?

     $hash = @{ Gruppe = $Gruppe
                        Nutzer = $Nutzer.Name

    }

     $hash = @{ Gruppe = $Gruppe
                Nutzer = $Nutzer.Name
                Nutzerkennung = $Nutzer.samAccountName}
            New-Object PSObject -Property $hash
    
    Viele Grüße


            New-Object PSObject -Property $hash

    Donnerstag, 25. Juni 2015 12:59
  • Hast du bei der Nutzerabfrage die Eigenschaft samAccountName mit ausgewählt ?

    $AllUsers= Get-ADUser -Filter * -Properties Memberof | select Name, Memberof, SamaAccountName

    Bei solchen Abfragen musst du immer schauen, welche Eigenschaften du brauchst. Nehm dir mal einen AD Nutzer und schau dir die Ausgaben von den Befehlen an.

    Get-ADUser -Identity <Nutzername>

    Get-ADUser -Identity <Nutzername> -Properties *

    Get-ADUser -Identity <Nutzername> -Properties Memberof, Created

    Get-ADUser -Identity <Nutzername> -Properties Memberof, Created | select Name, Created, MemberOf | fl

    Grüße Andy


    • Bearbeitet Andreas Bittner Freitag, 26. Juni 2015 08:11
    • Als Antwort markiert Better_M Montag, 29. Juni 2015 05:26
    Freitag, 26. Juni 2015 08:11