Benutzer mit den meisten Antworten
AD - Gruppenabfrage

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 memberSind 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
- Bearbeitet Denniver ReiningMVP, Moderator Donnerstag, 25. Juni 2015 11:33 Bitte Titel verwenden die das Thema der Frage beschreiben!
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
- Bearbeitet Andreas Bittner Donnerstag, 25. Juni 2015 10:55
- Als Antwort vorgeschlagen Denniver ReiningMVP, Moderator Donnerstag, 25. Juni 2015 11:33
- Als Antwort markiert Better_M Montag, 29. Juni 2015 05:27
-
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
-
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
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
- Bearbeitet Andreas Bittner Donnerstag, 25. Juni 2015 10:55
- Als Antwort vorgeschlagen Denniver ReiningMVP, Moderator Donnerstag, 25. Juni 2015 11:33
- Als Antwort markiert Better_M Montag, 29. Juni 2015 05:27
-
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
-
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
-
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 -
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