none
Frage nach der richtigen Positionierung eines Filters RRS feed

  • Frage

  • Hallo zusammen,

    wir möchten über ein Script unser AD nach Benutzerkonten durchsuchen, die nur dann in den Filter gelangen, wenn folgende Kriterien/Attribute erfüllt sind:

    1 Bedingung:
    msExchResourceDisplay-notlike"*"

    wenn ja, dann

    (description-notlike"*") -OR(description-notlike"abwesend")

    wenn ja, dann

    ((lastlogondate-notlike"*"-ORlastlogondate-le$time) -AND(passwordlastset-le$time) -and (description-notlike"*"))

    Das funzt auch mit folgendem Script:

    $DaysInactive=90

    $time

    =(Get-Date).Adddays(-($DaysInactive))

    (

    Get-ADUser-filter{(((lastlogondate-notlike"*"-ORlastlogondate-le$time) -AND(passwordlastset-le$time)) -AND(msExchResourceDisplay-notlike"*") -AND((description-notlike"*") -OR(description-notlike"abwesend")) -OR((description-notlike"*") -AND(msExchResourceDisplay-notlike"*")))} -SearchBase"OU=Test,.....,DC=local“-PropertiesLastLogonTimeStamp).DistinguishedName

    Sprich, ist ein Eintrag im Attribut msExchResourceDisplaygesetzt, ist alles danach egal.
    Wenn nein, dann wird weiter geprüft, ob in der Beschreibung der Wert "abwesend" steht.

    Nun gelangen aber in den Filter immer noch Userkonten, die aus anderen Gründen nicht gelöscht werden dürfen, auch wenn Sie in den Filter passen - z. B. User, welche 1x im Ahr von der Buchhaltung oder nur in Ausnahmesituationen benötigt werden und dann nicht neu erstellt werden dürfen.

    Für diese User setze ich das Attribut "adminDescription".

    Aber an welche Stelle des Gesamtscriptes muss ich nun den Filter (adminDescription -notlike "*") setzen, so dass auch meine Priorisierung passt.

    Sprich, erst wenn die Filter "msExchResourceDisplay" -notlike "*" oder adminDescription -notlike "*" oder description -notlike "abwesend" mit TRUE beantwortet werden, DANN sollen anderen Filter abgefragt werden.

    Kann mir hier jemand weiterhelfen?

    Vielen vielen Dank...


    Mit freundlichem Gruss - Harald Haas - MCSE Server Infrastructure 2012; MCTS Exchange Server 2010 Configuration;

    Dienstag, 28. April 2015 07:54

Antworten

  • Hallo H.Haas!

    Sorry, wenn ich manchmal etwas ruppig klinge.

    Ein Filter ist eine harte Ja / Nein Sache.
    Du sprichst immer von Priorisierung. Die gibt es hier nicht!

    Ein Filter wird IMMER als gesamtes betrachtet, Zwischensummen oder Zwischenmengen gibt es da nicht!

    Ein User in der OU hat KEINE Beschreibung und eine letzte Anmeldezeit von < 90 Tagen.

    Das sind 2 Kriterien.

    Der Filter, filtert aber auf 4 Kriterien!

    Du bringst in deinen Filtern die Begriffe "lastlogondate" und "LastLogonTimeStamp" durcheinander!

    Lies dazu mal diesen Artikel:

    http://kpytko.pl/active-directory-domain-services/lastlogon-vs-lastlogontimestamp/

    Du benutzt die folgenden Properties OHNE Sie vom Domänencontroller abzufragen:

    msExchResourceDisplay,
    PasswordLastSet,
    Description

    Hier ist es besser diese auch im Parameter -Properties anzugeben.

    Baue Komplizierte Filter zum Testen immer Stufenweise auf!

    $DaysInactive=90
    
    # Alle User bei denen das Datum vom LastLogonTimeStamp gesetzt ist
    # ist dein Testuser dabei? 
    Get-ADUser -filter {
      (lastlogondate -notlike"*")
    } -SearchBase 'OU=Test,.....,DC=local' -Properties LastLogonTimeStamp,msExchResourceDisplay,PasswordLastSet,Description
    
    # Alle User bei denen das Datum vom LastLogonTimeStamp gesetzt ist UND
    # die sich seit 90 Tagen nicht mehr angemeldet haben
    # ist dein Testuser dabei? 
    Get-ADUser -filter {
      (lastlogondate -notlike"*") -And
      (LastLogonTimeStamp -le (Get-Date).Date.Adddays(-($DaysInactive)))
    } -SearchBase 'OU=Test,.....,DC=local' -Properties LastLogonTimeStamp,msExchResourceDisplay,PasswordLastSet,Description
    
    ######## ACHTUNG hier benutze ich ein -OR !!!!
    # um "PasswordLastSet" oder "LastLogonTimeStamp" abzufragen. Jenachdem was zuerst eintritt.
    
    # Alle User bei denen das Datum vom LastLogonTimeStamp gesetzt ist UND
    # die sich seit 90 Tagen nicht mehr angemeldet haben ODER
    # die seit 90 kein neues Passwort mehr gesetzt haben
    # ist dein Testuser dabei?
    Get-ADUser -filter {
      (lastlogondate -notlike"*") -And
      ((LastLogonTimeStamp -le (Get-Date).Date.Adddays(-($DaysInactive))) -OR  (PasswordLastSet -le (Get-Date).Date.Adddays(-($DaysInactive))))
    } -SearchBase 'OU=Test,.....,DC=local' -Properties LastLogonTimeStamp,msExchResourceDisplay,PasswordLastSet,Description
    
    # Alle User bei denen das Datum vom LastLogonTimeStamp gesetzt ist UND
    # die sich seit 90 Tagen nicht mehr angemeldet haben ODER
    # die seit 90 kein neues Passwort mehr gesetzt haben UND
    # bei denen die Description leer ist  UND
    # bei denen die msExchResourceDisplay gesetzt ist
    # ist dein Testuser dabei?
    Get-ADUser -filter {
      (lastlogondate -notlike"*") -And
      ((LastLogonTimeStamp -le (Get-Date).Date.Adddays(-($DaysInactive))) -OR  (PasswordLastSet -le (Get-Date).Date.Adddays(-($DaysInactive)))) -And
      (description -notlike '*') -And
      (msExchResourceDisplay -notlike '*')
    } -SearchBase 'OU=Test,.....,DC=local' -Properties LastLogonTimeStamp,msExchResourceDisplay,PasswordLastSet,Description

    .... aber was passiert mit den Usern, die "abwesend" in der Beschreibung stehen haben und sich zuletzt vor 100 Tagen angemeldet haben bzw. wo ist der Unterschied in der Filterung bei den Usern, die z. B. Sachbearbeitung in der Beschreibung stehen haben.
    Für diese musst du jeweils eine völlige eigen abfrage stellen.
    Weil 'description -notlike "*"' schon stärker ist, als 'description -Like "*abwesend*"' oder 'description -Like "*sachbearbeiter*"'

    PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    auf der deutschsprachigen PowerShell Community

    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+

    Dienstag, 28. April 2015 12:30

Alle Antworten

  • Hi Harald,

    wie wäre es mit folgender Abfrage?

    $users = Get-ADUser -filter *
    
    foreach ($user in $users)
       {
       if ($user.msExchResourceDisplay -notlike "*" -OR $user.adminDescription -notlike "*" -OR $user.description -notlike "abwesend")
          {
          <RESTLICHE ABFRAGEN>
          }
       }
    Nicht getestet...


    Gruß

    Ben

    MCSA Windows 8 (.1) MCSA Windows Server 2012 (R2)

    Wenn Dir meine Antwort hilft, markiere sie bitte entsprechend als Antwort! Danke! :-)

    Hinweis: Meine Posts werden "wie besehen" ohne jedwede Gewähr bereitgestellt, da menschliche, technische und andere Fehler nicht ausgeschlossen werden können.


    • Bearbeitet Ben-neB Dienstag, 28. April 2015 08:06
    Dienstag, 28. April 2015 08:05
  • Hallo H.Haas!

    Du hast da viel doppel-gemoppel drin. So müsste es gehen:

    Get-ADUser -filter {
        (lastlogondate -notlike"*" -OR lastlogondate -le $time) -AND
        (passwordlastset -le $time) -AND
        (msExchResourceDisplay -notlike '*') -AND
        (description -notlike '*')
      } -SearchBase 'OU=Test,.....,DC=local' -PropertiesLastLogonTimeStamp


    PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    auf der deutschsprachigen PowerShell Community

    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+

    Dienstag, 28. April 2015 08:24
  • Hallo Peter,

    leider muss ich dich korrigieren - wenn ich deinen Vorschlag richtig lese, werden auch die Konten in den Filter gelangen, die in der Beschreibung "abwesend" stehen haben, wenn z.B. der Filter lastlogontimestamp passt.

    Die User, die das Feld Beschrebung gefüllt haben aber in den Filter lastlogondate -notlike"*" -OR lastlogondate -le $time) -AND
       
    (passwordlastset -le $time passen, sollen ja gefiltert werden.

    NUR die Personen, die

    msExchResourceDisplay -notlike '*' ODERdescription -notlike "abwesend" ODER
    adminDescription -notlike "*"

    dürfen nicht in die Filter, egal wie lange der letzte Passwortwechsel oder die letzte Anmeldung her ist.

    Die Filter

    lastlogondate -notlike"*" 
    lastlogondate -le $time)
    (passwordlastset -le $time
    description -notlike "*"

    sollen dann geprüft werden, wenn die ersten drei Filter ALLE mit TRUE beantwortet wurden.

    Die ersten drei Filter müssen die weiteren Filter überstechen, so dass es niemals zu der Situation kommt, dass ein Userkonto z. B. mit dem Attribut description -notlike "abwesend" gefiltert und weiterverarbeitet wird.

    Diese Anforderung kann ich irgendwie nicht aus deinem Vorschlag herauslesen - aber ich bin auch eher der Mausschubser und nicht der PowerSheller :-(

    Deswegen die Verschachtelung...


    Mit freundlichem Gruss - Harald Haas - MCSE Server Infrastructure 2012; MCTS Exchange Server 2010 Configuration;



    • Bearbeitet H.Haas Dienstag, 28. April 2015 08:41
    Dienstag, 28. April 2015 08:35
  • Hallo Ben-neB,

    auch hier komme ich nicht weiter...

    Der in der OU enthaltene User wird mir irgendwie hunderte Mal angezeigt, wenn ich das Scipts dann wie folgt ausführe:

    $Users=Get-ADUser-filter*


    $DaysInactive

    =90


    $time

    =(Get-Date).Adddays(-($DaysInactive))


    foreach

    ($userin$users)

       {

      

    if($user.msExchResourceDisplay -notlike"*"-OR$user.adminDescription -notlike"*"-OR$user.description -notlike"abwesend")

          {

          (

    Get-ADUser-filter{(description-notlike"*")} -SearchBase"OU=Test,......,DC=local“-PropertiesLastLogonTimeStamp).DistinguishedName

          }

       }


    Mit freundlichem Gruss - Harald Haas - MCSE Server Infrastructure 2012; MCTS Exchange Server 2010 Configuration;

    Dienstag, 28. April 2015 08:37
  • Hier vielleicht noch ein Beispiel:

    Ein User

    OHNE Beschreibung und

    OHNE gesetztes Attribut "msExchResourceDisplay" und

    OHNE gesetztes Attribut "adminDescription " und

    OHNE das Wort "abwesend" in der Bescreibung

    soll gefiltert werden, da der Filter description -notlike "*" mit false beantwortet wird.

    Werden die Attribute

    OHNE gesetztes Attribut "msExchResourceDisplay" und

    OHNE gesetztes Attribut "adminDescription " und

    OHNE das Wort "abwesend" in der Bescreibung

    mit TRUE beantwortet und

    hat der User eine Beschreibung (z. B. Sachbarbeitung) dann ist der letzte Passwortwechsel oder die letzte Anmeldung relevant, ob der User in den Filter gelangt oder nicht...

    Und wie eingangs beschrieben, das Script

    $DaysInactive=90

    $time

    =(Get-Date).Adddays(-($DaysInactive))

    (

    Get-ADUser-filter{(((lastlogondate-notlike"*"-ORlastlogondate-le$time) -AND(passwordlastset-le$time)) -AND(msExchResourceDisplay-notlike"*") -AND((description-notlike"*") -OR(description-notlike"abwesend")) -OR((description-notlike"*") -AND(msExchResourceDisplay-notlike"*")))} -SearchBase"OU=Test,.....,DC=local“-PropertiesLastLogonTimeStamp).DistinguishedName

    erfüllt alle Anforderungen Außer adminDescription -notlike "*"

    Aber wo muss es hin, damit die Priorisierung stimmt?


    Mit freundlichem Gruss - Harald Haas - MCSE Server Infrastructure 2012; MCTS Exchange Server 2010 Configuration;

    Dienstag, 28. April 2015 08:49
  • Hallo H.Haas!

    Sorry, aber du weißt anscheinend nicht was du tust!

    Du vermutest das mein Filter falsch ist. Einen Filter Testet man!

    Erst dann sieht man was er bringt. Denkfehler sind immer möglich!

    Wenn du auf {description -notlike '*'} filters, dann bekommst du nur User die GARKEINE Description haben. Also ist es egal ob ob du noch nach "abwesend" in der Description Filters, da die Description in der ersten Bedingung leer sein muss.

    Ein User OHNE Beschreibung und OHNE das Wort "abwesend" in der Beschreibung = Unsinn!


    PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    auf der deutschsprachigen PowerShell Community

    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+

    Dienstag, 28. April 2015 09:06
  • Hallo Peter,

    sorry, ich wollte dich hier nicht beleidigen oder deine Idee in Frage stellen....

    Ich wollte nur sicher stellen, dass man nicht aneinander vorbeiredet...

    natürlich teste ich dein Script aber was passiert mit den usern, die "abwesend" in der Beschreibung stehen haben und sich zuletzt vor 100 Tagen angemeldet haben bzw. wo ist der Unterschied in der Filterung bei den Usern, die z. B. Sachbearbeitung in der Bescreibung stehen haben.

    Benutzer mit dem Wort "abwesend" dürfen nie und Benutzer mit einem anderen Wort sollen bei Erfüllung der letzten Anmeldezeit >90 Tage gefiltert werden und Benutzer ohne Beschreibung müssen gefiltert werden, egal, wann die letzte Anmeldung her war...

    Das mein ich - ich kann die unterschiedliche Behandlungsweise der User in deinem Script nur nicht erkennen.

    Also bitte nicht persönlich nehmen!!!!! Bitte.


    Mit freundlichem Gruss - Harald Haas - MCSE Server Infrastructure 2012; MCTS Exchange Server 2010 Configuration;

    Dienstag, 28. April 2015 09:14
  • Hallo ein weiteres Mal Peter,

    ich habe nun dein Script getestet und wie erwartet nicht das richtige Ergebnis bekommen.

    Der Entwirf des Scriptes sieht wie folgt aus:

    $inactiveUsers=powershell {
    $DaysInactive = 90
    $time = (Get-Date).Adddays(-($DaysInactive))
    (Get-ADUser -filter {
        (lastlogondate -notlike"*" -OR lastlogondate -le $time) -AND
        (passwordlastset -le $time) -AND
        (msExchResourceDisplay -notlike '*') -AND
        (description -notlike '*')} -SearchBase "OU=Test,...DC=local“ -Properties LastLogonTimeStamp).DistinguishedName
    $count=0
    $UserDN=@()
    foreach ($user in $inactiveUsers)
    {
      $UserDN+= $User
      $count++
    }
    }


    Ein User in der OU hat KEINE Beschreibung und eine letzte Anmeldezeit von < 90 Tagen

    Die Filter

    msExchResourceDisplay -notlike "*" und

    adminDescription -notlike "*" und
    Description -notlike "abwesend"

    können alle drei mit TRUE beantwortet werden.

    Nach meiner Priorisierung hätte der User im Filter sein MÜSSEN, da keine Beschreibung wichtiger ist als die letzte Anmeldezeit.

    Leider ergibt ein Aufruf der Variable $inactiveusers kein Ergebnis...


    Mit freundlichem Gruss - Harald Haas - MCSE Server Infrastructure 2012; MCTS Exchange Server 2010 Configuration;




    Dienstag, 28. April 2015 09:28
  • Hallo H.Haas!

    Sorry, wenn ich manchmal etwas ruppig klinge.

    Ein Filter ist eine harte Ja / Nein Sache.
    Du sprichst immer von Priorisierung. Die gibt es hier nicht!

    Ein Filter wird IMMER als gesamtes betrachtet, Zwischensummen oder Zwischenmengen gibt es da nicht!

    Ein User in der OU hat KEINE Beschreibung und eine letzte Anmeldezeit von < 90 Tagen.

    Das sind 2 Kriterien.

    Der Filter, filtert aber auf 4 Kriterien!

    Du bringst in deinen Filtern die Begriffe "lastlogondate" und "LastLogonTimeStamp" durcheinander!

    Lies dazu mal diesen Artikel:

    http://kpytko.pl/active-directory-domain-services/lastlogon-vs-lastlogontimestamp/

    Du benutzt die folgenden Properties OHNE Sie vom Domänencontroller abzufragen:

    msExchResourceDisplay,
    PasswordLastSet,
    Description

    Hier ist es besser diese auch im Parameter -Properties anzugeben.

    Baue Komplizierte Filter zum Testen immer Stufenweise auf!

    $DaysInactive=90
    
    # Alle User bei denen das Datum vom LastLogonTimeStamp gesetzt ist
    # ist dein Testuser dabei? 
    Get-ADUser -filter {
      (lastlogondate -notlike"*")
    } -SearchBase 'OU=Test,.....,DC=local' -Properties LastLogonTimeStamp,msExchResourceDisplay,PasswordLastSet,Description
    
    # Alle User bei denen das Datum vom LastLogonTimeStamp gesetzt ist UND
    # die sich seit 90 Tagen nicht mehr angemeldet haben
    # ist dein Testuser dabei? 
    Get-ADUser -filter {
      (lastlogondate -notlike"*") -And
      (LastLogonTimeStamp -le (Get-Date).Date.Adddays(-($DaysInactive)))
    } -SearchBase 'OU=Test,.....,DC=local' -Properties LastLogonTimeStamp,msExchResourceDisplay,PasswordLastSet,Description
    
    ######## ACHTUNG hier benutze ich ein -OR !!!!
    # um "PasswordLastSet" oder "LastLogonTimeStamp" abzufragen. Jenachdem was zuerst eintritt.
    
    # Alle User bei denen das Datum vom LastLogonTimeStamp gesetzt ist UND
    # die sich seit 90 Tagen nicht mehr angemeldet haben ODER
    # die seit 90 kein neues Passwort mehr gesetzt haben
    # ist dein Testuser dabei?
    Get-ADUser -filter {
      (lastlogondate -notlike"*") -And
      ((LastLogonTimeStamp -le (Get-Date).Date.Adddays(-($DaysInactive))) -OR  (PasswordLastSet -le (Get-Date).Date.Adddays(-($DaysInactive))))
    } -SearchBase 'OU=Test,.....,DC=local' -Properties LastLogonTimeStamp,msExchResourceDisplay,PasswordLastSet,Description
    
    # Alle User bei denen das Datum vom LastLogonTimeStamp gesetzt ist UND
    # die sich seit 90 Tagen nicht mehr angemeldet haben ODER
    # die seit 90 kein neues Passwort mehr gesetzt haben UND
    # bei denen die Description leer ist  UND
    # bei denen die msExchResourceDisplay gesetzt ist
    # ist dein Testuser dabei?
    Get-ADUser -filter {
      (lastlogondate -notlike"*") -And
      ((LastLogonTimeStamp -le (Get-Date).Date.Adddays(-($DaysInactive))) -OR  (PasswordLastSet -le (Get-Date).Date.Adddays(-($DaysInactive)))) -And
      (description -notlike '*') -And
      (msExchResourceDisplay -notlike '*')
    } -SearchBase 'OU=Test,.....,DC=local' -Properties LastLogonTimeStamp,msExchResourceDisplay,PasswordLastSet,Description

    .... aber was passiert mit den Usern, die "abwesend" in der Beschreibung stehen haben und sich zuletzt vor 100 Tagen angemeldet haben bzw. wo ist der Unterschied in der Filterung bei den Usern, die z. B. Sachbearbeitung in der Beschreibung stehen haben.
    Für diese musst du jeweils eine völlige eigen abfrage stellen.
    Weil 'description -notlike "*"' schon stärker ist, als 'description -Like "*abwesend*"' oder 'description -Like "*sachbearbeiter*"'

    PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    auf der deutschsprachigen PowerShell Community

    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+

    Dienstag, 28. April 2015 12:30
  • Harald bitte benutze den "Codeblock-Einfügen" Button rechts oben über der Edit Box wenn du Code postest!.

    Danke, Denniver


    Blog: http://bytecookie.wordpress.com

    Kostenloser Powershell Snippet Manager v3: Link
    (Schneller, besser + einfacher scripten.)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.

    Mittwoch, 29. April 2015 11:37
    Moderator