큰 그룹 멤버 열거
이 항목에서는 범위 검색이 작동하는 방식을 설명하며 범위 검색을 사용하여 그룹 멤버를 가져오는 몇 가지 코드 예제를 제공합니다. 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.
}
참고 항목
참조
개념
Send comments about this topic to Microsoft.
Copyright © 2007 by Microsoft Corporation. All rights reserved.