큰 그룹 멤버 열거

이 항목에서는 범위 검색이 작동하는 방식을 설명하며 범위 검색을 사용하여 그룹 멤버를 가져오는 몇 가지 코드 예제를 제공합니다. adschema 그룹 개체에는 한 배열에 여러 값이 들어 있는 멤버라는 속성이 있습니다. adschema의 그룹 개체 또는 멤버 특성에 대한 자세한 내용은 https://go.microsoft.com/fwlink/?LinkID=27252에서 MSDN Library의 "그룹" 또는 "멤버" 항목을 참조하십시오.

그룹 멤버 자격이 매우 큰 경우가 있으므로 이 속성에 수백 개의 값이 포함될 수도 있습니다. 범위 검색은 한 번에 특정 비율의 멤버를 가져오는 프로세스입니다. Windows Server 2003의 경우 서버에서 한 번에 검색할 수 있는 최대 값 수는 1500입니다. 범위 검색을 집합의 값 수보다 큰 값으로 설정하면 검색이 되지 않습니다. 검색 범위를 더 작은 값으로 설정하면 새 결과를 더 자주 서버로 반환해야 하므로 검색 성능이 떨어질 수 있습니다. 범위 검색에 대한 자세한 내용은 "많은 멤버를 포함하는 그룹 열거"를 참조하십시오.

다음 코드 예제에서는 범위 검색을 사용하여 그룹 멤버를 가져오는 방법을 보여 줍니다. 이 샘플에서는 항목 0에서 500까지를 검색합니다. 이 결과 집합의 최대 항목 수는 501입니다.

DirectoryEntry group = new DirectoryEntry("LDAP://CN=Sales,DC=Fabrikam,DC=COM");
DirectorySearcher groupMember = new DirectorySearcher
    (group,"(objectClass=*)",new string[]{"member;Range=0-500"},SearchScope.Base);
SearchResult result = groupMember.FindOne();
// Each entry contains a property name and the path (ADsPath).
// The following code returns the property name from the PropertyCollection. 
String propName=String.Empty;
foreach(string s in result.Properties.PropertyNames)
{
    if ( s.ToLower() != "adspath")
    {
      propName = s;
      break;
    }
}
foreach(string member in result.Properties[propName])
{
     Console.WriteLine(member);
}

범위 검색을 사용하면 결과 집합 내의 지정된 지점에서 시작하고 종료하여 결과 집합의 일정 부분을 검색할 수도 있습니다. 이렇게 하려면 {"member;Range=0-500"} 문을 수정합니다. 예를 들어 결과 집합에서 세 번째 및 네 번째 항목을 검색하려면 {"member;Range=2-3"} 문을 사용합니다. 502에서 시작하여 결과 집합의 끝까지 모든 항목을 검색하려면 {"member;Range=501-*"} 문을 사용합니다.

마지막 코드 예제에서는 그룹의 멤버 수를 잘 모를 때 범위 검색을 사용하여 그룹의 모든 멤버를 가져오는 방법을 보여 줍니다. 결과 집합에 있는 것보다 더 많은 멤버를 가져오려고 하면 범위 검색이 작동하지 않으므로 이 코드 예제에서는 실패 여부를 테스트하며 실패 발생 시 범위 문을 ("member;range={0}-*", rangeLow)로 변경하여 집합에 최종 멤버를 열거합니다.

try
{
    DirectoryEntry entry = new DirectoryEntry("LDAP://CN=My Distribution List,OU=Distribution Lists,DC=Fabrikam,DC=com");
    DirectorySearcher searcher = new DirectorySearcher(entry);
    searcher.Filter = "(objectClass=*)";

    uint rangeStep = 1000;
    uint rangeLow = 0;
    uint rangeHigh = rangeLow + (rangeStep - 1);
    bool lastQuery = false;
    bool quitLoop = false;

    do
    {
        string attributeWithRange;
        if(!lastQuery)
        {
            attributeWithRange = String.Format("member;range={0}-{1}", rangeLow, rangeHigh);
        }
        else
        {
            attributeWithRange = String.Format("member;range={0}-*", rangeLow);
        }           
        searcher.PropertiesToLoad.Clear();
        searcher.PropertiesToLoad.Add(attributeWithRange);
        SearchResult results = searcher.FindOne();
        searcher.Dispose();
        foreach(string res in results.Properties.PropertyNames)
        {
            System.Diagnostics.Debug.WriteLine(res.ToString());
        }
        if(results.Properties.Contains(attributeWithRange))
        {
            foreach(object obj in results.Properties[attributeWithRange])
            {
                Console.WriteLine(obj.GetType());
                if(obj.GetType().Equals(typeof(System.String)))
                {
                }
                else if (obj.GetType().Equals(typeof(System.Int32)))
                {
                }
                Console.WriteLine(obj.ToString());
            }
            if(lastQuery)
            {
                quitLoop = true;
            }
        }
        else
        {
            lastQuery = true;
        }
        if(!lastQuery)
        {
            rangeLow = rangeHigh + 1;
            rangeHigh = rangeLow + (rangeStep - 1);
        }
    }
    while(!quitLoop);
}
catch(Exception ex)
{
    // Handle exception ex.
}

참고 항목

참조

System.DirectoryServices

개념

그룹 관리

Send comments about this topic to Microsoft.

Copyright © 2007 by Microsoft Corporation. All rights reserved.