J'utilise les classes d'espace de noms System.DirectoryServices.AccountManagement pour gérer l'appartenance de plusieurs groupes. Ces groupes contrôlent la population de notre système de comptabilité d'impression et certains d'entre eux sont très importants. Je rencontre un problème en supprimant un utilisateur de l'un de ces grands groupes. J'ai un programme de test qui illustre le problème. Notez que le groupe que je teste n'est pas imbriqué, mais user.IsMemberOf() semble également avoir le même problème, alors que GetAuthorizationGroups() affiche correctement les groupes dont un utilisateur est membre. Le groupe en question a environ 81K membres, ce qui est plus que ce qu'il aurait dû puisque Remove() ne fonctionne pas, et sera normalement d'environ 65K.GroupPrincipal.Members.Remove() ne fonctionne pas avec un grand groupe AD
Je serais intéressé d'entendre d'autres personnes qui ont eu ce problème et l'ont résolu. J'ai un cas ouvert avec Microsoft, mais l'appel est lent car le centre d'appel a environ 17 heures de décalage horaire, de sorte qu'ils n'arrivent pas au travail avant environ une heure avant de partir pour la maison.
using (var context = new PrincipalContext(ContextType.Domain))
{
using (var group = GroupPrincipal.FindByIdentity(context, groupName))
{
using (var user = UserPrincipal.FindByIdentity(context, userName))
{
if (user != null)
{
var isMember = user.GetAuthorizationGroups()
.Any(g => g.DistinguishedName == group.DistinguishedName);
Console.WriteLine("1: check for membership returns: {0}", isMember);
if (group.Members.Remove(user))
{
Console.WriteLine("user removed successfully");
group.Save();
}
else
{
// do save in case Remove() is lying to me
group.Save();
Console.WriteLine("user remove failed");
var isStillMember = user.GetAuthorizationGroups()
.Any(g => g.DistinguishedName == group.DistinguishedName);
Console.WriteLine("2: check for membership returns: {0}", isStillMember);
}
}
}
}
}
Si j'étais vous je jetterais un coup d'oeil à l'espace de noms System.DirectoryServices.Protocols en traitant avec le groupe qui est aussi grand que le vôtre. Le code est plus difficile à écrire, mais vous utiliserez l'interface LDAP native qui peut être beaucoup plus efficace dans votre cas. MSDN a un excellent guide @ http://msdn.microsoft.com/en-us/library/bb332056.aspx. –