Могу ли я получить более 1000 записей из DirectorySearcher?

StackOverflow https://stackoverflow.com/questions/90652

  •  01-07-2019
  •  | 
  •  

Вопрос

Я только что заметил, что список возвращаемых результатов ограничен 1000.У меня более 1000 групп в моем домене (ОГРОМНЫЙ домен).Как я могу получить более 1000 записей?Могу ли я начать с более поздней записи?Могу ли я разделить его на несколько поисковых запросов?

Вот мой запрос:

DirectoryEntry dirEnt = new DirectoryEntry("LDAP://dhuba1kwtn004");
string[] loadProps = new string[] { "cn", "samaccountname", "name", "distinguishedname" };
DirectorySearcher srch = new DirectorySearcher(dirEnt, "(objectClass=Group)", loadProps);
var results = srch.FindAll();

Я попытался установить srch.SizeLimit = 2000;, но, похоже, это не работает.Есть какие-нибудь идеи?

Это было полезно?

Решение

Вам нужно установить DirectorySearcher.pageSize в ненулевое значение, чтобы получить все результаты.

Кстати, вам также следует утилизировать DirectorySearcher, когда вы закончите с ним

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

Документация API не очень понятна, но по сути:

  • когда вы выполняете поиск по страницам, SizeLimit игнорируется, и все совпадающие результаты возвращаются по мере перебора результатов, возвращаемых FindAll.Результаты будут извлекаться с сервера по странице за раз.Я выбрал значение 1000 выше, но вы можете использовать меньшее значение, если предпочитаете.Компромисс заключается в следующем:использование небольшого размера страницы приведет к более быстрому возврату каждой страницы результатов, но потребует более частых обращений к серверу при переборе большого количества результатов.

  • по умолчанию поиск не выполняется постранично (pageSize = 0).В этом случае возвращаются результаты до предельного размера.

Как указал Бири, важно утилизировать SearchResultCollection, возвращаемый FindAll, иначе у вас может возникнуть утечка памяти как описано в разделе "Примечания" документации MSDN для DirectorySearcher.Найдите все.

Один из способов избежать этого в .NET 2.0 или более поздней версии - написать метод-оболочку, который автоматически удаляет SearchResultCollection.Это может выглядеть примерно следующим образом (или может быть методом расширения в .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
}

Затем вы могли бы использовать это следующим образом:

using(var srch = new DirectorySearcher(dirEnt, "(objectClass=Group)", loadProps))
{
    srch.PageSize = 1000;
    var results = SafeFindAll(srch);
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top