2014-09-04 48 views
1

我需要将很多用户添加到AD组中。我将所有用户SAMAccountNames存储在datagridview中。使用AccountManagement将多个用户添加到AD组*快速*使用AccountManagement

下面的代码工作,但缓慢。就好像在我拨打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 

回答

1

如果您在For Each之前加载存在于List对象中的所有用户,然后查看该用户是否存在于List中,该怎么办?那样你只查询AD一次?

像这样:

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); 
      } 
    } 
} 
+0

听起来他想将用户添加到AD组,而不是一个inmemory集合。 – 2014-09-04 16:55:11

+1

@WiktorZychla [我跑到类似的问题](http://stackoverflow.com/questions/2409432/improving-performance-of-system-directoryservices-accountmanagement)在我的编码也。 DirectyServices中的很多方法不会缓存“Members”之类的结果,因此每次都会重新查询。将组中当前成员的列表复制到内存集合中,确实会加速'g.Members.Contains'调用。 – 2014-09-04 16:55:57

+0

@WiktorZychla,通过这种方式添加它,每次迭代时他都不必查询AD。因此,加快这一进程。 – 2014-09-04 16:56:48

相关问题