quen_to 0 Geschrieben 9. Mai 2019 Melden Teilen Geschrieben 9. Mai 2019 Hallo liebe Community Habe gerade angefangen, mit Powershell herumzuexperimentieren und es macht Spass. Allerdings stehe ich jetzt etwas an. Ich möchte von allen Benutzern aus dem gesamten AD, die einer bestimmten Gruppe angehören, bestimmte Attribute auslesen. Bis jetzt habe ich folgenden Code: $SearchBase = 'OU=Standard,OU=User,OU=xxx,OU=xxxx,DC=xxxx,DC=xxxx' Get-ADUser -Filter * -SearchBase $SearchBase -properties Title,department,telephonenumber,mobile,mail Das funktioniert eigentlich grundsätzlich. Ich würde den Script aber gerne etwas optimieren... und zwar möchte ich nur die Accounts aufgeführt haben, die in der Gruppe "XY" sind. Wie baue ich meinen Code entsprechend um? Habe es so versucht: Get-ADUser -Filter * -SearchBase $SearchBase | Where-Object {$_.MemberOf -contains "GruppeXY"} Wenn mich diesen Starte... passiert nix. Der Cursor springt auf die nächste Zeile und gut ist, keinen Fehler oder ähnliches. Was mache ich falsch? Und dann hätte ich noch eine zweite kleine Frage:. Wenn ich ganz normal den Get-ADUser-Befehl starte ohne spezielle Params, dann kriege ich ja einen bestimmten Datensatz mit vordefinierten Attributen raus (DistinguishedName, GivenName etc.). Ich möchte aber jedes Attribut selbst bestimmten was ausgelesen wird. Das Ziel ist, nur die Daten zu bekommen die ich auch weiterverarbeiten möchte. Danke für Eure Hilfe und bis später :-) Beste Grüsse - quen Zitieren Link zu diesem Kommentar
BOfH_666 577 Geschrieben 9. Mai 2019 Melden Teilen Geschrieben 9. Mai 2019 (bearbeitet) Ich würde Dir empfehlen, die Gruppenmitglieder mittels Get-ADGroupMember zu ermitteln und nur diese dann per Pipe an ein Foreach-Object weiterzugeben und darin dann mittels Get-ADUser nur diese User aus dem AD zu saugen. Das sollte deutlich schneller gehen, als das ganze AD oder die ganze -SearchBase erst auszulesen und dann hinterher zu filtern. Das cmdlet Get-ADUser hat einen Parameter -Properties. Damit kannst Du, neben den per default ausgegebenen Attributen, weitere angeben, die Du ausgegeben haben möchtest. Welche es insgesamt gibt, kannst Du einfach ermitteln, in dem Du mal z.B. Deinen eigenen Account mit Get-ADUser -Identity 'UserName' -Properties * ausgibst. Unabhängig von all dem, ist es immer empfehlenswert, die Hilfe der cmdlets zu lesen, die Du benutzt bzw. benutzen möchtest ... komplett und inklusive der Beispiele. bearbeitet 9. Mai 2019 von BOfH_666 Zitieren Link zu diesem Kommentar
quen_to 0 Geschrieben 9. Mai 2019 Autor Melden Teilen Geschrieben 9. Mai 2019 Danke für die Hinweise. Ich habe mir die Hilfen und Beispiele angeschaut und im Lab einiges versucht.. so ganz verstehe ich den Foreach-Object Befehl noch nicht. Get-ADGroupMember -Identity BeekeeperBenutzer | ForEach-Object Get-ADUser -Filter * -Properties Title,department Ich verstehe nicht, wie ich den ForEach-Object schreiben muss, dass der Script interpretiert werden kann. Ich versuchs weiter, bin aber trotzdem für jeden Tipp dankbar. Zitieren Link zu diesem Kommentar
BOfH_666 577 Geschrieben 9. Mai 2019 Melden Teilen Geschrieben 9. Mai 2019 (bearbeitet) vor 37 Minuten schrieb quen_to: Ich habe mir die Hilfen und Beispiele angeschaut .... Bist Du sicher? Vielleicht machst Du erst nochmal einen kleinen Schritt zurück und nimmst Dir ein wenig Zeit, um die Grundlagen von Powershell zu erlernen. Das erspart Dir bestimmt eine Menge verschwendeter Zeit, Missverständnisse und Frustration. Es ist bestimmt jenseits der Möglichkeiten eines solchen Forums, Dich Powershell zu lehren. Foreach-Object verarbeitet die über die Pipeline ( | ) weitergereichten Objekte ... eins nach dem anderen. Das jeweilige Object wird durch die Laufvariable ( $_ oder $PSItem ) repräsentiert. Und der gebräuchliste Weg, diese Verarbeitung durchzuführen, ist mit einem Scriptblock, der in geschweifte Klammern ( { ... } ) eingeschlossen ist. Dein Beispiel sollte also ungefähr so aussehen: Get-ADGroupMember -Identity 'BeekeeperBenutzer' | ForEach-Object {Get-ADUser -Identity $_ -Properties Title,department,telephonenumber,mobile,mail } Um die Ausgabe dann auf die gewünschten Attribute zu beschränken, leitet man die Ausgabe dann noch an ein Select-Object weiter und gibt nur die Properties an die man sehen möchte. Get-ADGroupMember -Identity 'BeekeeperBenutzer' | ForEach-Object {Get-ADUser -Identity $_ -Properties Title,department,telephonenumber,mobile,mail } | Select-Object -Property Name,Title,department,telephonenumber,mobile,mail Es gibt gute Bücher, die Dir die Grundlagen näher bringen können oder Turorials im Internet oder sogar kostenlose Video-Kurse in der Microsoft Virtual Academy - Getting Started with Powershell. Sehr empfehlenswert ist auch der Powershell Best Practices and Style Guide. bearbeitet 9. Mai 2019 von BOfH_666 Zitieren Link zu diesem Kommentar
quen_to 0 Geschrieben 9. Mai 2019 Autor Melden Teilen Geschrieben 9. Mai 2019 Naja... soweit ich in den letzten 3 Stunden mit Lesen/Probieren gekommen bin.. Ja Der Script von Dir hat mich enorm weitergebracht, vor allem zu verstehen wie das ganze mit den Pipes funktioniert. Werde heute noch zu verstehen versuchen, was es mit dem $-Zeichen auf sich hat. Danke tausendmal BOfH_666... und ich habe bereits zwei Bücher da die ich in diesem Monat abarbeiten möchte. Und so Gott will, verstehe ich Powershell irgendwann einmal Danke für alles! Zitieren Link zu diesem Kommentar
BOfH_666 577 Geschrieben 9. Mai 2019 Melden Teilen Geschrieben 9. Mai 2019 vor 8 Minuten schrieb quen_to: ... und ich habe bereits zwei Bücher da die ich in diesem Monat abarbeiten möchte. Ich bin jetzt shcon stolz auf Dich. ... wenn Du der englishen Sprache einigermaßen mächtig bist, solltest Du Dir den Video-Kurs, den Dir verlinkt hatte, mal ansehen ... der verschafft einem schon einen guten Überblick und Du bekommst die Powershell vom Erfinder erklärt. Zitieren Link zu diesem Kommentar
daabm 1.355 Geschrieben 9. Mai 2019 Melden Teilen Geschrieben 9. Mai 2019 Ich würde da mal was anders machen beim Foreach... Man kann das pipen, oder man macht es als Schleife. Oben ist die Pipe-Variante. Ich bevorzuge immer $Members = Get-ADGroupMember -Identity 'WeNeedMoreBeer' Foreach ( $Member in $Members ) { $Member | Select-Object -Property LastOrder } Zum einen ist das schneller (Faktor 2 bis 10), zum anderen erzeugt es deutlich besser lesbaren Code Zitieren Link zu diesem Kommentar
BOfH_666 577 Geschrieben 9. Mai 2019 Melden Teilen Geschrieben 9. Mai 2019 vor 1 Stunde schrieb daabm: Zum einen ist das schneller (Faktor 2 bis 10), Hmmm ... wenn Geschwindigkeit wirklich ein relevantes Thema sein sollte - einfach beide Varianten testen mit Measure-Command! Zitieren Link zu diesem Kommentar
daabm 1.355 Geschrieben 9. Mai 2019 Melden Teilen Geschrieben 9. Mai 2019 Mir ging es mehr um das zweite Argument - lesbarer Code. Nix gegen Pipelining, wenn man das mal kurz auf der Commandline eintippt. Aber der TO sprach von einem Skript, und da finde ich halt Foreach besser als die Pipe. Das ist besser lesbar und damit auch einfacher wartbar. Und auch einfacher zu debuggen :-) Zitieren Link zu diesem Kommentar
quen_to 0 Geschrieben 10. Mai 2019 Autor Melden Teilen Geschrieben 10. Mai 2019 Ich konnte zwar mit Eurer Hilfe den Export machen, kann diesen aber aufgrund des Formats nicht in Excel importieren da ich eine Listenansicht mit Überschrift-Spalte benötige. Ich habe zwar eine vermeintliche Lösung gefunden... wenn es denn nur so funktionieren würde wie ich mir das vorstelle Get-ADUser -Filter * -Properties SamAccountName,GivenName,Surname,title,department,telephonenumber,mobile,mail,userAccountControl -Searchbase "OU=xxx,OU=xxx,OU=xxx,OU=xxx,DC=xxx,DC=xxx" | select SamAccountName,GivenName,Surname,title,department,telephonenumber,mobile,mail,userAccountControl Das Problem ist jetzt wieder das Format. Wenn ich mit dem select-Befehl nur 4 Attribute mitgebe, wird das wunderbar als Liste mit Kopfzeile ausgegeben. Wenn ich nun aber mehr Attribute definiere, kommt die Ansicht wieder in Blöcken. Wie kann ich das unterbinden resp. sicherstellen, dass die Ausgabe in Listenform und somit importierbar gespeichert wird? Man hätte das mit genügend Skills sicher locker mit dem Get-ADGroupMember-Code realisieren können.. nur ist mir das noch zu hoch... Danke für jede Hilfe. Zitieren Link zu diesem Kommentar
tesso 375 Geschrieben 10. Mai 2019 Melden Teilen Geschrieben 10. Mai 2019 (bearbeitet) Schau dir mal das CmdLet Export-CSV an. Das ist das was du suchst. Dann klappt auch der Import in Excel. PS: Ich seh grad in deinem Code fehlt die abfrage der Gruppe. Du nimmst alle Uaser aus ein OU. bearbeitet 10. Mai 2019 von tesso Zitieren Link zu diesem Kommentar
BOfH_666 577 Geschrieben 10. Mai 2019 Melden Teilen Geschrieben 10. Mai 2019 (bearbeitet) .... und noch ein Hinweis: Wenn Du das cmdlet Export-Csv studiert hast und das ausprobierst und Excel beim Öffnen der CSV-Datei ein bissl zickig ist, weil es ein Deutsches Excel ist und nicht mit dem Komma als Delimiter klarkommt, nimmst Du einfach -Delimiter ';' .... dann klappt das auch noch. bearbeitet 10. Mai 2019 von BOfH_666 Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.