Enumerar los miembros de un grupo grande

En este tema se explica cómo funciona la recuperación por intervalos y se proporcionan varios ejemplos de código que muestran cómo utilizar este tipo de recuperación para obtener los miembros de un grupo. El objeto de grupo adschema incluye una propiedad llamada member que contiene varios valores en una matriz. Para obtener más información sobre el objeto de grupo o el atributo member de adschema, vea los temas sobre grupo o Member de la biblioteca de MSDN en https://go.microsoft.com/fwlink/?LinkID=27252.

A veces este grupo contiene muchos miembros, por lo que esta propiedad puede contener cientos de valores. La recuperación por intervalos es un proceso para obtener una parte de los miembros simultáneamente. Para Windows Server 2003, el número máximo de valores que se pueden recuperar del servidor simultáneamente es 1.500. Si establece la recuperación por intervalos en un valor mayor que el número de valores del grupo, la búsqueda genera un error. Si establece el intervalo en un número pequeño, se puede reducir el rendimiento de la búsqueda porque ésta debe devolver los nuevos resultados al servidor con más frecuencia. Para obtener más información sobre la recuperación por intervalos, vea Enumerar grupos que contienen muchos miembros.

El siguiente código de ejemplo muestra cómo obtener los miembros de un grupo mediante la recuperación por intervalos. En este ejemplo se recuperan 0-500 entradas, ambas inclusive. El número máximo de entradas para este conjunto de resultados es 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);
}

También puede utilizar la recuperación por intervalos para recuperar una parte del conjunto de resultados si comienza y finaliza en un punto especificado del conjunto del resultados. Para ello, modifique la instrucción {"member;Range=0-500"}. Por ejemplo, para recuperar la tercera y cuarta entrada en el conjunto de resultados, utilizará la instrucción {"member;Range=2-3"}. Para recuperar todas las entradas, comenzando por la 502 hasta el final del conjunto de resultados, utilizará la instrucción {"member;Range=501-*"}.

El ejemplo de código final muestra cómo utilizar una recuperación por intervalos para obtener todos los miembros del grupo cuando no sabe cuántos miembros hay en el mismo. Como la recuperación por intervalos no funciona si trata de obtener más miembros de los que hay en el conjunto de resultados, este ejemplo de código prueba un error y, cuando lo recibe, cambia la instrucción del intervalo a ("member;range={0}-*", rangeLow) para enumerar los miembros finales del grupo.

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

Consulte también

Referencia

System.DirectoryServices

Conceptos

Administración de grupos

Send comments about this topic to Microsoft.

Copyright © 2007 Microsoft Corporation. Reservados todos los derechos.