Can I get more than 1000 records from a DirectorySearcher? Can I get more than 1000 records from a DirectorySearcher? asp.net asp.net

Can I get more than 1000 records from a DirectorySearcher?


You need to set DirectorySearcher.PageSize to a non-zero value to get all results.

BTW you should also dispose DirectorySearcher when you're finished with it

using(var srch = new DirectorySearcher(dirEnt, "(objectClass=Group)", loadProps)){    srch.PageSize = 1000;    var results = srch.FindAll();}

The API documentation isn't very clear, but essentially:

  • when you do a paged search, the SizeLimit is ignored, and all matching results are returned as you iterate through the results returned by FindAll. Results will be retrieved from the server a page at a time. I chose the value of 1000 above, but you can use a smaller value if preferred. The tradeoff is: using a small PageSize will return each page of results faster, but will require more frequent calls to the server when iterating over a large number of results.

  • by default the search isn't paged (PageSize = 0). In this case up to SizeLimit results is returned.

As Biri pointed out, it's important to dispose the SearchResultCollection returned by FindAll, otherwise you may have a memory leak as described in the Remarks section of the MSDN documentation for DirectorySearcher.FindAll.

One way to help avoid this in .NET 2.0 or later is to write a wrapper method that automatically disposes the SearchResultCollection. This might look something like the following (or could be an extension method in .NET 3.5):

public IEnumerable<SearchResult> SafeFindAll(DirectorySearcher searcher){    using(SearchResultCollection results = searcher.FindAll())    {        foreach (SearchResult result in results)        {            yield return result;                }     } // SearchResultCollection will be disposed here}

You could then use this as follows:

using(var srch = new DirectorySearcher(dirEnt, "(objectClass=Group)", loadProps)){    srch.PageSize = 1000;    var results = SafeFindAll(srch);}


I tried to use given solution to achieve pagination but it doesnt work.I set pageSize = 100; and i get all the items through searchResult.

dirSearcher = new DirectorySearcher(direntry);dirSearcher.Filter = ("(|(objectClass=volume). (objectClass=user)(objectClass=printQueue)(objectClass=computer). (objectClass=organizationalUnit)(objectClass=Group))");

            dirSearcher.PageSize = 100;            dirSearcher.SearchScope = System.DirectoryServices.SearchScope.Subtree;            dirSearcher.ServerTimeLimit = new TimeSpan(1000);            //dirSearcher.VirtualListView = new DirectoryVirtualListView(0, 100, 1);            using (SearchResultCollection results = dirSearcher.FindAll())            {                foreach (SearchResult result in results)                {                    DirectoryEntry ent = result.GetDirectoryEntry();                    ADItem ProviderItem = Context.ConvertToItem(ent, true);                    if (ProviderItem != null)                    {                        ProviderItem.IsPartialData = true;                        ProviderItems.Add(ProviderItem);                    }                }            }        }