Bernado 0 Geschrieben 27. Juni 2019 Melden Teilen Geschrieben 27. Juni 2019 Hallo zusammen, ich bin nach längerer Suche und vielen Versuchen jetzt leider doch genötigt, mal zu fragen, ob jemand noch eine Idee hat für einen Neuling hat. Kurze Einführung: Ich habe von einem Kollegen, der abhanden gekommen ist, ein Skript übernommen, welches wilde Dinge macht. Leider ist es nicht sehr effizient, so dass sich das Skript bei der Anzahl an AD Mitgliedern (mehrere tausend und auch mehrere tausend Gruppen) mittlerweile quasi selbst überholt, da es ca. alle 30 Minuten laufen muss. Ich versuche es generell neu aufzubauen, aber bis dahin muss ich mir eine Krücke ausdenken. Das AD ist alt "klassisch" mit OUs aufgebaut. Folgende Aufgaben erfüllt das Skript: AD Mitglied ist in der Sub OU "NA-Finanzen" in der Sicherheitsgruppe "NA-Finanzen-Orga-Applikation" (darf die Abteilung selbst hinzufügen; "NA" variiert über die Sub-OUs) gleiches AD Mitglied hat eine E-Mail-Adresse xy"@contoso.com" gleiches AD Mitglied hat im Büro "Texas" eingetragen gleiches AD Mitglied muss "enabled" sein wenn o.g. vier Bedingungen erfüllt sind, füge es der zentralen Sicherheitsgruppe "Globalefinanzen-Orga-Applikation" hinzu wenn eine der Bedingungen nicht mehr erfüllt ist, entferne das AD Mitglied aus der Gruppe "Globalefinanzen-Orga-Applikation" Von diesen Sub OUs gibt es aktuell 34, immerhin alle gleich aufgebaut. Das Skript ist entsprechend mit so vielen if/else und Schleifen versehen, mit try/catch über alles, und fragt die Gruppen rekursiv ab, dass es nicht zuuuu schnell läuft. Meine Idee war daher irgendwie eher über ein Array zu arbeiten, ähnlich folgendem: wobei da noch die Mail-Prüfung fehlt, aber es funktioniert schon nicht mehr, wenn Office abgefragt wird. Sorry, wie gesagt, als Neuling vielleicht auch ein wenig zu viel auf einmal. Codeausschnitt: $ZentraleGruppe = "Globalefinanzen-Orga-Applikation" $Gruppen = (Get-ADGroup -Filter {Name -like "*-Finanzen-Orga-App*" | select-object -ExpandProperty name) $Mitglieder1Tex=@(Get-ADGroupMember $Gruppen | Get-ADUser | Where {$_.enabled -eq 'true'-and $_.physicalDeliveryOfficeName -eq 'Texas' } | Foreach{$_.SamAccountname}) Add-ADGroupMember $ZentraleGruppe -Members $Mitglieder1Tex Ich hoffe ich habe jetzt erstmal nichts vergessen. Vielen Dank schon mal, dass Ihr überhaupt bis hierhin gelesen habt! Zitieren Link zu diesem Kommentar
4077 30 Geschrieben 27. Juni 2019 Melden Teilen Geschrieben 27. Juni 2019 "Physicaldeliveryofficename" ist erst verfügbar, wenn Du bei Get-ADUser ein "-properties *" hinzufügst. Zitieren Link zu diesem Kommentar
BOfH_666 577 Geschrieben 27. Juni 2019 Melden Teilen Geschrieben 27. Juni 2019 (bearbeitet) vor 53 Minuten schrieb Bernado: Meine Idee war daher irgendwie eher über ein Array zu arbeiten, ähnlich folgendem: wobei da noch die Mail-Prüfung fehlt, aber es funktioniert schon nicht mehr, wenn Office abgefragt wird. Gute Idee. Würd ich genau so machen. Wenn ich das nicht falsch verstanden habe, solltest Du mit: $SearchBase = 'NA-Finanzen...' $AllUsersList = Get-ADUser -Filter * -SearchBase $SearchBase -Properties MemberOf, physicalDeliveryOfficeName, mail ... alles Nötige im Array $AllUsersList haben, was Du für Deine Prüfungen brauchst, oder? ... ich würde erwarten, dass das die Sache ewtas beschleunigen sollte. ($SearchBase musst Du natürlich entsprechend korrekt setzen) bearbeitet 27. Juni 2019 von BOfH_666 Zitieren Link zu diesem Kommentar
Bernado 0 Geschrieben 27. Juni 2019 Autor Melden Teilen Geschrieben 27. Juni 2019 Ahh! Super, danke euch beiden. Zitat $SearchBase = 'NA-Finanzen...' Ja, das stimmt, wenn das nicht variieren würde. Also es gibt 34 OUs mit "Finanzen". Die Searchbase müsste also Contoso sein und er müssten in den Sub-OUs die '*-Finanzen-Orga-...*' suchen. Das wollte ich ja mit $Gruppen = (Get-ADGroup -Filter {Name -like "*-Finanzen-Orga-App*" | select-object -ExpandProperty name) versuchen. Ich bin leider im erklären schlecht. Pardon. Beispiel: Contoso NA-Finanzen Benutzer Meyer, Fritz (Office=Texas, Memberof=NA-Finanzen-Orga-Applikation, Mail='fritz.meyer@contoso.com') ... Gruppen NA-Finanzen-Orga-Applikation US-Finanzen RE-Finanzen PP-Finanzen Zentrale Gruppen Globalefinanzen-Orga-Applikation Zitieren Link zu diesem Kommentar
BOfH_666 577 Geschrieben 27. Juni 2019 Melden Teilen Geschrieben 27. Juni 2019 (bearbeitet) Wenn Du Dir die Gruppen in ein Array packst, kannst Du mit einer Foreach-Schleife drüber iterieren. Wenn Du Select-Object -ExpandProperty benutzt, machst Du aus vielseitigen Objekten dumme Strings. In Deinem Code-Beispiel hast Du zwei AD-Abfragen, von welcher eine noch eine weitere geschachtelte und direkt gefilterte AD-Abfrage enthält. Ich hätte versucht, das eventuell zu vermeiden. Du könntest die Abfrage auch weiter "oben" absetzen und somit erstmal ALLE Daten für ALLE relevanten Gruppen und Anwender einsammeln. Dann brauchst Du nicht 34 mal das AD durchhühnern. bearbeitet 27. Juni 2019 von BOfH_666 1 Zitieren Link zu diesem Kommentar
daabm 1.355 Geschrieben 27. Juni 2019 Melden Teilen Geschrieben 27. Juni 2019 Jepp. Collect once, then process... Zitieren Link zu diesem Kommentar
Bernado 0 Geschrieben 27. Juni 2019 Autor Melden Teilen Geschrieben 27. Juni 2019 Gesagt, getan! Klappt tatsächlich wunderbar (mit dem Array zu arbeiten)! Danke!! Zitieren Link zu diesem Kommentar
daabm 1.355 Geschrieben 27. Juni 2019 Melden Teilen Geschrieben 27. Juni 2019 Prima. Hilft immer, wenn man bei Powershell alle Objekte auch Objekte sein läßt und halt mit denen arbeitet. Du kannst denen ja sogar per Add-Member nachträglich Properties anklatschen, wenn das später irgendwo hilfreich ist... 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.