Enumerazione dei membri di un gruppo di grandi dimensioni

In questo argomento viene descritto il funzionamento del recupero per intervalli e vengono forniti vari esempi di codice per utilizzare il recupero per intervalli per ottenere l'elenco dei membri di un gruppo. L'oggetto gruppo adschema contiene una proprietà chiamata member che include più valori in una matrice. Per ulteriori informazioni sull'oggetto gruppo o sull'attributo member di adschema, vedere gli argomenti "Gruppo" o "Member" in MSDN Library all'indirizzo https://go.microsoft.com/fwlink/?LinkID=27252 (le informazioni potrebbero essere in lingua inglese).

Poiché le appartenenze ai gruppi possono talvolta essere numerose, questa proprietà può contenere centinaia di valori. Il recupero per intervalli è un processo mediante il quale si ottiene una parte dei membri alla volta. Per Windows Server 2003, il numero massimo di valori recuperabili dal server contemporaneamente è 1500. Se il recupero per intervalli viene impostato su un valore superiore al numero di valori del set, la ricerca avrà esito negativo. Se l'intervallo viene impostato su un numero basso, è possibile che le prestazioni della ricerca si degradino poiché occorre tornare al server più spesso per ottenere nuovi risultati. Per ulteriori informazioni sul recupero per intervalli, vedere Enumerazione di gruppi contenenti molti membri.

Nell'esempio di codice seguente viene mostrato come ottenere i membri di un gruppo utilizzando il recupero per intervalli. Vengono recuperate le voci 0-500 incluse. Il numero massimo di voci per questo set di risultati è 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);
}

È inoltre possibile utilizzare il recupero per intervalli per recuperare una parte del set di risultati iniziando e finendo in uno specifico punto del set di risultati stesso. A questo scopo, modificare l'istruzione {"member;Range=0-500"}. Ad esempio, per recuperare la terza e la quarta voce di un set di risultati, si utilizza l'istruzione {"member;Range=2-3"}. Per recuperare tutte le voci, a partire dalla numero 502 fino alla fine del set di risultati, si utilizza l'istruzione {"member;Range=501-*"}.

Nell'ultimo esempio di codice viene mostrato come utilizzare il recupero per intervalli per ottenere tutti i membri del gruppo quando non si sa quanti ne fanno parte. Poiché il recupero per intervalli non funziona se si cerca di ottenere più membri di quanti ne sono inclusi nel set di risultati, questo esempio di codice restituisce un errore e modifica l'istruzione ("member;range={0}-*", rangeLow) così da enumerare i membri finali del set.

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

Vedere anche

Riferimenti

System.DirectoryServices

Concetti

Gestione di gruppi

Send comments about this topic to Microsoft.

Copyright © 2007 Microsoft Corporation. Tutti i diritti riservati.