Zum Inhalt

Active Directory – Supersonic and the directory searcher

Whats the difference between supersonic and the directory searcher? Nothing, because if you get over ~1000 you crash into a wall. 🙂
Last week we had to deal with the limitations on the directory searcher.
We performed a user search on an organizational unit (subtree) with more than 1000 users beneath. We where astonished that our userobject only contained 1000 items every time we did the search. I wrote a little test script in powershell to reproduce this behaviour and to see if this limitation is a C# problem or not.

So I wrote this script:

As expected, powershell returned only 1000 objects. Then we tried to find out why and looked at the $objSearcher property list.

$objSearcher | get-member Active Directory

As you can see, there are two interesting properties: sizelimit and pagesize. So I played around with these two properties and found some explanations for them. Sizelimit is the limit for the maximum returned results, but you can’t set this property above 1000. So I looked at the second property, pagesize. This property sets the maximum result items per returned page. So all you have to do is, set sizelimit to 0 and set pagesize to 1000 and you will get all of your items.

If you set pagesize to 1000 and expect more than 1000 returned items the active directory returns your first 1000 items, then pause for a split and returns the next x items and so on until all found items are returned. This property has a appreciable impact on your searchresult duration.

After some research I found some tutorials on how to increment these limitations in the active directory, but i don’t know what impact such a change would have, so i can live with the pagesize property 😉

Veröffentlicht in.NETBusinessCoding

6 Kommentare

  1. DSC DSC

    Das war ein sehr faszinierender Artikel. Super! Danke, dass
    sie diese ErklÀrung bereit gestellt haben.

  2. Kandace Kandace

    Kann Ihre WebprÀsenz einfach nicht verlassen, ohne noch zeitig zu erwÀhnen,
    dass ich es toll finde, wie sie in Ihrem Blog förderliche
    ErklĂ€rungen fĂŒr Ihre Leser zur verfĂŒgung stellen.
    Warte gespannt auf neuwertige BeitrÀge.

  3. IG IG

    Schade, dass Sie keinen Donate Button haben!
    dann werde ich erstmal einen Bookmark setzen und bei Facebook Ihren Link einbauen.

    Ich wĂŒrde ganz gerne eine kleinigkeit fĂŒr Ihren eindrucksvollen Blog spenden.
    Ich freue mich bereits auf zusÀtzliche Artikel.

  4. Die Infos gibt es kostenlos :). Helfe gerne

  5. Jan Asmus Jan Asmus

    Ich schreibe zu sowas normalerweise nichts, aber es ist eine schlechte Angewohnheit so zu arbeiten:

    $colResults = $objSearcher.FindAll()
    foreach ( $objResult in $colResults ) {# hier passiert irgendwas}

    Erstmal alles in eine Variable packen und dann alles was drin ist zu verarbeiten kann einem diese Variable ganz schön aufblÀhen.

    Stattdessen sollte wie folgt verfahren werden:
    $cnt = 0
    $objSearcher.FindAll() | foreach {
    #mach irgendwas
    $cnt++
    }

    So wird nur Object fĂŒr Object verarbeitet…

    ansonsten unterstĂŒtze ich die Nutzung des System.DirectoryServices , da es um ca. den Faktor 8 bis 9 schneller ist als get-ad….. oder gar get-qad…

  6. Hi Jan,
    das stimmt, da es nicht gerade zutrÀglich zur Performance ist und unnötig alles aufblÀht.
    Es war eigentlich eher zum verstĂ€ndlich machen gedacht, anstatt als echtes Codebeispiel, wie man ĂŒber Objekte iteriert.
    Danke fĂŒr dein Kommentar

    Viele GrĂŒĂŸe Marco

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.