Я использую классы пространства имен System.DirectoryServices.AccountManagement для управления членством в нескольких группах. Эти группы контролируют население нашей системы учета печати, и некоторые из них очень велики. Я сталкиваюсь с проблемой удаления любого пользователя из одной из этих больших групп. У меня есть тестовая программа, которая иллюстрирует проблему. Обратите внимание, что группа, которую я тестирую, не является вложенной, но user.IsMemberOf () также, похоже, имеет ту же проблему, тогда как GetAuthorizationGroups () правильно показывает группы, в которые входит пользователь. В рассматриваемой группе около 81 тыс. Участников, что больше, чем следовало бы, так как Remove () не работает и обычно составляет около 65 тыс.
Мне было бы интересно услышать от других людей, которые имели эту проблему и решили ее. У меня есть открытое дело с Microsoft, но переадресация вызова происходит медленно, поскольку в колл-центре разница во времени составляет около 17 часов, поэтому они не приходят на работу примерно за час до того, как я обычно уезжаю домой.
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 );
}
}
}
}
}