System.DirectoryServices.AccountManagement名前空間クラスを使用して、いくつかのグループのメンバーシップを管理しています。これらのグループは私たちの印刷会計システムの人口を管理しており、それらのいくつかは非常に大きいです。これらの大きなグループの1つからユーザーを削除する際に問題が発生しています。問題を説明するテストプログラムがあります。テストしているグループはネストされていませんが、user.IsMemberOf()にも同じ問題があるようですが、GetAuthorizationGroups()は、ユーザーがメンバーであるグループを正しく示していることに注意してください。問題のグループには約81Kのメンバーがいます。これは、Remove()が機能していないため、必要以上に多く、通常は約65K程度になります。
この問題を抱えて解決した他の人たちから話を聞いてみたいと思います。私はマイクロソフトのオープンケースを持っていますが、コールセンターは約17時間の時差があるため、電話のターンアラウンドは遅く、私が通常家に帰る約1時間前まで彼らは仕事に到着しません。
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 );
}
}
}
}
}