枚举大组中的成员
本主题说明范围检索的工作方式,并提供若干代码示例,说明如何使用范围检索获取某个组的成员。adschema 组对象包含称为 member 的属性,该属性在数组中包含多个值。有关 adschema 中组对象或成员属性的详细信息,请参阅 MSDN Library(网址为 https://go.microsoft.com/fwlink/?LinkID=27252)中的“Group(组)”或“Member(成员)”主题。
由于组成员资格有时会相当大,因此此属性可能包含几百个值。范围检索是一个一次获取一部分成员的过程。对于 Windows Server 2003,一次最多可以从服务器中检索 1,500 个值。如果您设置的范围检索值高于集合中的值数目,则搜索将失败。如果将范围设置为一个较小的数值,则可能会降低搜索的性能,因为必须更频繁地返回服务器检索新的结果。有关范围检索的详细信息,请参阅“枚举包含许多成员的组”。
以下代码示例显示如何使用范围检索获取组的成员。此示例检索 0-500(包含 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.
版权所有 (C) 2007 Microsoft Corporation。保留所有权利。