Benutzer mit den meisten Antworten
Get-ADuser - OU ausschliessen

Frage
-
Hallo Powershell-Freunde
Ich probiere gerade ein Skript zu schreiben, dass mir alle User der gesamten Domäne ausgibt und dann in ein CSV exportiert.
Soweit so gut. Ich habe es geschafft, alle User der Domäne abzufragen und in ein CSV zu exportieren.Jedoch möchte ich nun gewisse OU's von der Abfrage ausschliessen.
Ich möchte natürlich das Skript so schreiben, dass es in Zukunft möglichst einfach ist, dass Skript anzupassen.
Deshalb habe ich folgende Variable bzw. ein Array definiert.
$excludeOU = @("OU_01","OU_02","OU_03","OU_04") $ADusers = (Get-ADUser -Filter * -SearchBase "DC=MYDOM,DC=LAB" -Properties * |where {$_.distinguishedname -notcontains "*$excludeOU*"}) $ADusers |select sn,givenName,physicalDeliveryOfficeName,telephoneNumber,mail,streetAddress,l,title,department,manager ` | export-csv C:\Temp\AD_USERS.csv -notypeinformation -delimiter ";" -encoding utf8
Das Problem ist nun, dass meine WHERE-Einschränkung nicht funktioniert. Er igonriert $_.distinguishedname -notcontains "*$excludeOU*". Es funktioniert jedoch, wenn ich eine spezifisch OU, welche ich nicht auslesen will, angebe: $_.distinguishedname -notcontains "*OU=OU_01*". Für mich scheint das Problem daran zu liegen, dass irgendwie nicht auf den Inhalt des Arrays $excludeOU zugegriffen werden kann. Wenn ich jedoch $excludeOU auslese, zeigt er mir die OU's an, welche ich definiert habe.
Danke für jede Hilfe :-)
ICT-Shelby- Bearbeitet _DisplayName_ Donnerstag, 26. März 2015 13:29
Antworten
-
Zunächst sieht dies aus, wie eine einfache Frage. Diese hat es aber doch in sich...
Walters Vorschlag ist richtig, man kann das ganze aber etwas abkürzen. Der Match Operator soll nur benutzt werden, wenn man auch Reguläre Ausdrücke verwendet. Das ist hier nicht der Fall. Aber Reguläre Ausdrücke können helfen, in dem man die Array Elemente mit einem "oder" ( | ) verbindet. Dann kann der Match Operator nach den entsprechenden Werten in dem DistinguishedName suchen.
$exclude = 'Chile', 'Germany', 'Russia' $pattern = $exclude -join '|' $users = Get-ADUser -Filter * -Properties Country | Where-Object DistinguishedName -NotMatch $patternWen
Wenn ein paar Benutzer zum Testen gewünscht sind: Create Lab User Accounts 2.0.
-Raimund
- Als Antwort markiert _DisplayName_ Montag, 30. März 2015 06:34
Alle Antworten
-
Das wird wegen NOTCONTAINS nicht klappen, dieser Operator macht nicht das, was Du haben willst.
Mit contains kannst Du abfragen, ob ein Array ein bestimmtes Element beinhaltet:
PS C:\> 1,3,5,7 -contains 3 True
Ich bin jetzt kein Powershell-Guru, aber bei mir hat es wie folgt geklappt:
$ExcludedOUs = @("OU=ASZ","OU=SF3_UK") $BaseOU = "OU=Accounts,DC=contoso,DC=com" $ADUsersRaw = Get-ADUser -Filter * -SearchBase $BaseOU $ADUsersFiltered = foreach ($User in $ADUsersRaw) { $MatchesExludedOUs = $false foreach ($OU in $ExcludedOUs) { if ( $User.DistinguishedName -match $OU ) { $MatchesExludedOUs = $true } } if ( !$MatchesExludedOUs ) { $User } }
Mit der inneren Schleife bilde ich quasi eine ODER-Verknüpfung nach: Sobald der DN eines Users auch nur zu einer einzigen Excluded-OU passt, wird $MatchesExcludedOUs auf TRUE gesetzt und bleibt es auch.
Vielleicht kann man das auch eleganter lösen, aber immerhin, es klappt.
- Bearbeitet WalterFMB Donnerstag, 26. März 2015 20:12 ergänzt
-
Zunächst sieht dies aus, wie eine einfache Frage. Diese hat es aber doch in sich...
Walters Vorschlag ist richtig, man kann das ganze aber etwas abkürzen. Der Match Operator soll nur benutzt werden, wenn man auch Reguläre Ausdrücke verwendet. Das ist hier nicht der Fall. Aber Reguläre Ausdrücke können helfen, in dem man die Array Elemente mit einem "oder" ( | ) verbindet. Dann kann der Match Operator nach den entsprechenden Werten in dem DistinguishedName suchen.
$exclude = 'Chile', 'Germany', 'Russia' $pattern = $exclude -join '|' $users = Get-ADUser -Filter * -Properties Country | Where-Object DistinguishedName -NotMatch $patternWen
Wenn ein paar Benutzer zum Testen gewünscht sind: Create Lab User Accounts 2.0.
-Raimund
- Als Antwort markiert _DisplayName_ Montag, 30. März 2015 06:34
-
Hoi Andrée
Danke für deine Antwort.
Ich habe dein Lösungsvorschlag ausprobiert. Und es hat funktioniert. Genau so wie ich das will.
Ich muss ehrlich gestehen, ich weiss aber nicht genau, was das $pattern bzw. das $exclude -join '|' bewirkt?!
Kannst du mir dies kurz und bündig erläutern, damit ich in meinem Skript auch diesen Codeteil verstehe? :-)Danke und Gruss
ICT-Shelby -
Alles dreht sich hier um Reguläre Ausdrücke (RegEx).
Der Join Operator verbindet Elemente zu einem String und hier wird das Pipe-Zeichen quasi als Füllmenge genutzt
$a = 1,2,3 $a = $a -join '|' $a # -> 1|2|3
Das Pipe-Zeichen ist der ODER Operator in RegEx: http://metahtml.sourceforge.net/documentation/regex/welcome.mhtml#TOC16. Der Match / NonMatch Operator filtert somit alle Werte heraus, die einem der in dem Pattern string zusammengeführten entsprechen / nicht entsprechen.
RegEx sind ein sehr nützliches Werkzeug: http://www.regular-expressions.info/tutorial.html
-Raimund