c# - GroupPrincipal.Members.Remove() 不适用于大型 AD 组

标签 c# .net active-directory account-management

我正在使用 System.DirectoryServices.AccountManagement命名空间类来管理多个组的成员资格。这些团体控制着我们打印会计系统的人口,其中一些非常庞大。我在从这些大组之一中删除任何用户时遇到问题。我有一个测试程序可以说明问题。请注意,我正在测试的组不是嵌套的,但 user.IsMemberOf() 似乎也有同样的问题,而 GetAuthorizationGroups() 正确显示了用户所属的组。所讨论的群组有大约 81,000 名成员,这超出了应有的数量,因为 Remove() 不起作用,通常约为 65,000 名左右。

我很想听听其他遇到此问题并已解决的人的意见。我有一个与 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 );

                }
            }
        }
    }
}

最佳答案

事实证明,这是 GroupPrincipal.Members.Remove() 代码中的一个错误,其中对于超过 1500 名成员的组,删除失败。这已在 .NET 4.0 Beta 2 中修复。我不知道他们是否计划将修复程序移植到 2.0/3.x。

解决方法是获取底层 DirectoryEntry,然后使用 Invoke 对 IADsGroup 对象执行 Remove 命令。

 var entry = group.GetUnderlyingObject() as DirectoryEntry;
 var userEntry = user.GetUnderlyingObject() as DirectoryEntry;
 entry.Invoke( "Remove", new object[] { userEntry.Path } );

关于c# - GroupPrincipal.Members.Remove() 不适用于大型 AD 组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1860772/

相关文章:

c++ - 如何使用 C++ Win32 API 获取当前系统域 IP 地址?

c# - 从公司身份验证获取 Azure 帐户 key

c# - Protobuf-net 有教程吗?

c# - 有没有办法编写适用于多种类型的扩展方法?

c# - 这个棕褐色调转换算法有什么问题?

c# - 窗体的透明背景图像 - 窗体的平滑边缘形状

http - 如何在 Active Directory 中使用 NTLM 身份验证

c# - (byte)Convert.ToChar(anyStringOfLengthOne) 怎么可能抛出错误?

c# - 将关系数据集转换为 List<T>

c# - .NET 中的单元测试和 UI 测试