C# 使用AccountManagement*快速*向广告组添加多个用户
我有大量的用户需要添加到广告组中。我将所有用户C# 使用AccountManagement*快速*向广告组添加多个用户,c#,vb.net,active-directory,account-management,C#,Vb.net,Active Directory,Account Management,我有大量的用户需要添加到广告组中。我将所有用户SAMAccountNames存储在datagridview中 下面的代码工作得很慢。当我调用g.members.add时,它就像是在直接查询每个用户一样。有没有更有效的方法添加它们 For Each r As DataGridViewRow In dgvFinalUsers.Rows Dim userName As String = r.Cells(0).Value If Not g.Members.Contains(ctx, Iden
SAMAccountNames
存储在datagridview中
下面的代码工作得很慢。当我调用g.members.add
时,它就像是在直接查询每个用户一样。有没有更有效的方法添加它们
For Each r As DataGridViewRow In dgvFinalUsers.Rows
Dim userName As String = r.Cells(0).Value
If Not g.Members.Contains(ctx, IdentityType.SamAccountName, userName) Then
g.Members.Add(ctx, IdentityType.SamAccountName, userName)
i += 1
Debug.Print(i)
End If
Next
g.save
如果在For Each之前将存在的所有用户加载到列表对象中,然后查看该用户是否存在于列表中,该怎么办?这样你就只查询一次广告了 像这样:
var domainMembers = new List<Principal>();
using (var context = new PrincipalContext( ContextType.Domain ))
{
GroupPrincipal grp = GroupPrincipal.FindByIdentity(context, IdentityType.SamAccountName, "Domain Users");
foreach(var user in grp.GetMembers(false))
{
if(user)
{
domainMembers.add(user);
}
}
}
var domainMembers=newlist();
使用(var context=newprincipalcontext(ContextType.Domain))
{
GroupPrincipal grp=GroupPrincipal.FindByIdentity(上下文,IdentityType.SamAccountName,“域用户”);
foreach(grp.GetMembers中的var用户(false))
{
如果(用户)
{
添加(用户);
}
}
}
听起来他想将用户添加到广告组,而不是内存集合中。@WiktorZychla在我的代码中也是如此。DirectyServices中的许多方法不缓存“Members”之类的结果,因此每次都会重新查询。将组中当前成员的列表复制到内存集合中确实加快了g.members.Contains
调用的速度。@WiktorZychla,通过这种方式添加,他不必在每次AD迭代时查询AD。因此,加快这个过程。@ScottChamberlain:AccountManagement API无论如何都会有糟糕的性能。我们有超过50k用户的域控制器,以这种方式将用户分组持续3秒钟,在DirectoryEntry
级别工作可以让您以毫秒的速度完成任务()您可以将您的代码发布为答案,以便其他有此问题的用户可以看到您是如何完成的,或者如果此答案回答了您的问题,请将其标记为答案吗?