Sdílet prostřednictvím


Auflisten von Membern einer umfangreichen Gruppe

In diesem Thema wird erläutert, wie der Bereichsabruf funktioniert. Es enthält mehrere Codebeispiele zur Verwendung des Bereichsabrufs, um die Member einer Gruppe abzurufen. Das group-Objekt adschema enthält eine Eigenschaft mit dem Namen member, die mehrere Werte in einem Array enthält. Weitere Informationen zum group-Objekt oder member-Attribute in adschema finden Sie in den Themen "Group" bzw. "Member" in der MSDN Library unter https://go.microsoft.com/fwlink/?LinkID=27252.

Da die Gruppenmitgliedschaft bisweilen sehr umfangreich sein kann, kann diese Eigenschaft sehr viele Werte enthalten. Beim Bereichsabruf wird jeweils nur ein Teil der Member abgerufen. Bei Windows Server 2003 beträgt die maximale Anzahl von Werten, die gleichzeitig vom Server abgerufen werden können, 1500. Wenn der Bereichsabruf auf einen Wert eingestellt wird, der größer ist als die Anzahl der Werte im Set, schlägt die Suche fehl. Wenn der Bereich auf eine kleine Zahl eingestellt wird, kann die Leistung der Suche beeinträchtigt werden, da vom Server häufiger neue Ergebnisse übergeben werden müssen. Weitere Informationen zum Bereichsabruf finden Sie unter "Auflisten von Gruppen mit vielen Membern".

Im folgenden Codebeispiel wird veranschaulicht, wie Member einer Gruppe mithilfe des Bereichsabrufs abgerufen werden. Im Beispiel werden die Einträge 0 bis 500 (einschließlich) abgerufen. Die maximale Anzahl von Einträgen für dieses Resultset beträgt 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);
}

Mit dem Bereichsabruf kann auch ein Teil des Resultsets abgerufen werden, indem der Startpunkt und der Endpunkt im Resultset angegeben werden. Dazu muss die Anweisung {"member;Range=0-500"} entsprechend geändert werden. Um beispielsweise den dritten und vierten Eintrag im Resultset abzurufen, verwenden Sie die Anweisung {"member;Range=2-3"}. Um beispielsweise alle Einträge im Resultset ab dem Eintrag 502 bis zum Ende abzurufen, verwenden Sie die Anweisung {"member;Range=501-*"}.

Im letzten Codebeispiel wird veranschaulicht, wie mit dem Bereichsabruf alle Member der Gruppe abgerufen werden, wenn nicht bekannt ist, wie viele Member in der Gruppe enthalten sind. Da der Bereichsabruf nicht funktioniert, wenn mehr Member abgerufen werden, als im Resultset enthalten sind, wird in diesem Codebeispiel ein Fehlertest ausgeführt. Bei einem Fehler wird die Bereichsanweisung auf ("member;range={0}-*", rangeLow), um die letzten Member im Set aufzulisten.

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

Siehe auch

Referenz

System.DirectoryServices

Konzepte

Gruppenverwaltung

Send comments about this topic to Microsoft.

Copyright © 2007 Microsoft Corporation. Alle Rechte vorbehalten.