none
Get-ADuser - OU ausschliessen RRS feed

  • 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


    Donnerstag, 26. März 2015 13:28

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
    Freitag, 27. März 2015 18:29

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
    Donnerstag, 26. März 2015 20:11
  • 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
    Freitag, 27. März 2015 18:29
  • 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

    Montag, 30. März 2015 06:34
  • 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

    Montag, 30. März 2015 06:42