gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:11:42 27 4
gpt4 key购买 nike

我正在使用 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com