Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用AccountManagement*快速*向广告组添加多个用户_C#_Vb.net_Active Directory_Account Management - Fatal编程技术网

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
级别工作可以让您以毫秒的速度完成任务()您可以将您的代码发布为答案,以便其他有此问题的用户可以看到您是如何完成的,或者如果此答案回答了您的问题,请将其标记为答案吗?