Énumération des membres d'un grand groupe
Cette rubrique explique comment fonctionne la récupération de plages et fournit plusieurs exemples de code permettant d'utiliser ce processus pour obtenir les membres d'un groupe. L'objet de groupe adschema contient une propriété appelée « membre » qui contient plusieurs valeurs dans un tableau. Pour plus d'informations sur l'objet de groupe ou l'attribut membre dans adschema, voir les rubriques sur les groupes ou les membres dans MSDN Library à l'adresse https://go.microsoft.com/fwlink/?LinkID=27252.
Les appartenances au groupe étant parfois volumineuses, cette propriété peut contenir des centaines de valeurs. La récupération de plages est un processus permettant d'obtenir une partie des membres en une fois. Pour Windows Server 2003, 1 500 valeurs au maximum peuvent être récupérées en une fois sur le serveur. Si vous définissez la récupération de plages sur une valeur supérieure au nombre de valeurs de l'ensemble, la recherche échoue. Si vous définissez la plage sur un chiffre inférieur, vous risquez d'altérer les performances de la recherche, car elle doit retourner plus souvent vers le serveur pour obtenir de nouveaux résultats. Pour plus d'informations sur la récupération de plages, voir la rubrique sur l'énumération de groupes qui contiennent plusieurs membres.
L'exemple de code suivant montre comment obtenir les membres d'un groupe en utilisant la récupération de plages. Cet exemple récupère les entrées 0 à 500 incluses. Le nombre maximal d'entrées pour ce jeu de résultats est 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);
}
Vous pouvez également utiliser la récupération de plages pour récupérer une partie du jeu de résultats en commençant et en terminant à un point spécifique du jeu de résultats. Pour ce faire, modifiez l'instruction {"member;Range=0-500"}. Par exemple, pour récupérer les quatrième et cinquième entrées du jeu de résultats, utilisez l'instruction {"member;Range=2-3"}. Pour récupérer toutes les entrées, de 502 à la fin du jeu de résultats, utilisez l'instruction {"member;Range=501-*"}.
Le dernier exemple de code montre comment utiliser la récupération de plages pour obtenir tous les membres du groupe lorsque vous n'en connaissez pas le nombre. Comme la récupération de plages ne fonctionne pas si vous tentez d'obtenir plus de membres que le nombre contenu dans le jeu de résultats, cet exemple de code cherche une défaillance. Lorsque le test le reçoit, il change l'instruction de plage en ("member;range={0}-*", rangeLow) pour énumérer les derniers membres du jeu.
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.
}
Voir aussi
Référence
Concepts
Send comments about this topic to Microsoft.
Copyright © 2007 par Microsoft Corporation. Tous droits réservés.