2010-02-15 5 views
3

Le code C# suivant (.NET Framework 3.5) renvoie le nom et la description de tous les utilisateurs d'un groupe AD "xyz". Cela fonctionne très bien tant qu'il renvoie un petit nombre d'enregistrements. Mais, il est très lent quand il renvoie plus de 100 enregistrements. Toutes les suggestions seraient grandement appréciées. Merci d'avance!Problème de performance System.DirectoryServices.AccountManagement?

var context = new PrincipalContext(ContextType.Domain); 

var grp = GroupPrincipal.FindByIdentity(context, "xyz"); 

var users = grp.GetMembers(true); 

var usersList = users.Select(n => new { UserName = n.Name, 
             Description = n.Description }) 
         .OrderBy(o => o.UserName.ToString()); 

Console.WriteLine(usersList.ToList()); 

Répondre

4

Vous obtiendrez de meilleures performances en effectuant une requête d'étendue d'attribut (ASQ). Voici quelques exemples de code:

DirectoryEntry group = new DirectoryEntry("LDAP://CN=All Staff,OU=Groups,DC=domain,DC=local"); 

DirectorySearcher searcher = new DirectorySearcher(); 
searcher.SearchRoot = group; 
searcher.Filter = 
    "(&(objectClass=user)(objectCategory=person)(mail=*))"; 
searcher.PropertiesToLoad.Add("mail"); 
searcher.SearchScope = SearchScope.Base; 

searcher.AttributeScopeQuery = "member"; 

List<string> mail; 
using (SearchResultCollection results = searcher.FindAll()) 
{ 
    mail = new List<string>(); 
    foreach (SearchResult result in results) 
    { 
     mail.Add(result.Properties["mail"][0].ToString()); 
    } 
} 

D'une manière générale System.DirectoryServices.AccountManagement va vous donner des performances plus lent que System.DirectoryServices. Cependant, 99% du temps, vous ne serez pas en mesure de le remarquer. Cependant, dans ce cas, votre exemple est d'itérer à travers chaque objet et de le tirer à travers le fil, tandis que mon exemple tire parti de LDAP pour faire tout le travail en notre nom.

Notez que ce code ne fonctionne que pour les groupes de moins de 1000 membres. Si vous avez un groupe plus grand que cela, vous aurez besoin d'une page qui est un code plus compliqué mais pas un gros problème.

+0

Merci beaucoup! J'ai remarqué une amélioration des performances lorsque j'ai changé le grp.GetMembers (true) en grp.GetMembers (false). Mon code a également retourné toutes les lignes au lieu de 1000 premiers. – rk1962