Programing

DirectorySearcher에서 1000 개 이상의 레코드를 가져올 수 있습니까?

lottogame 2020. 11. 7. 08:57
반응형

DirectorySearcher에서 1000 개 이상의 레코드를 가져올 수 있습니까?


결과에 대한 반환 목록이 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를 0이 아닌 값으로 설정해야합니다.

BTW 당신이 그것을 완료하면 DirectorySearcher도 폐기해야합니다

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

API 문서는 명확하지 않지만 본질적으로 다음과 같습니다.

  • 페이지 검색을 수행하면 SizeLimit이 무시되고 FindAll에서 반환 된 결과를 반복 할 때 일치하는 모든 결과가 반환됩니다. 결과는 한 번에 한 페이지 씩 서버에서 검색됩니다. 위에서 1000의 값을 선택했지만 원하는 경우 더 작은 값을 사용할 수 있습니다. 단점은 작은 PageSize를 사용하면 각 결과 페이지가 더 빨리 반환되지만 많은 수의 결과를 반복 할 때 서버를 더 자주 호출해야한다는 것입니다.

  • 기본적으로 검색은 페이징되지 않습니다 (PageSize = 0). 이 경우 최대 SizeLimit 결과가 반환됩니다.

Biri가 지적했듯이 FindAll에서 반환 한 SearchResultCollection을 처리하는 것이 중요합니다. 그렇지 않으면 DirectorySearcher.FindAll에 대한 MSDN 설명서의 Remarks 섹션에 설명 된대로 메모리 누수가 발생할 수 있습니다 .

.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);
}

참고 URL : https://stackoverflow.com/questions/90652/can-i-get-more-than-1000-records-from-a-directorysearcher

반응형