枚举大组中的成员

本主题说明范围检索的工作方式,并提供若干代码示例,说明如何使用范围检索获取某个组的成员。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.
}

另请参见

参考

System.DirectoryServices

概念

组管理

Send comments about this topic to Microsoft.

版权所有 (C) 2007 Microsoft Corporation。保留所有权利。