2014-09-04 2 views
1

AD 그룹에 추가해야하는 사용자 수가 매우 많습니다. 나는 모든 사용자가 SAMAccountNames을 datagridview에 저장했습니다.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

당신이 각각에 대한 전에 목록 개체로 존재하고 사용자가 목록에있는 경우 다음을 참조 모든 사용자를로드하는 경우? 그렇게하면 광고를 한 번만 쿼리하게됩니까? 이처럼

는 :

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

그는 아닌 inmemory 컬렉션에 광고 그룹에 사용자를 추가 할 소리. –

+1

@WiktorZychla [비슷한 문제가 발생했습니다] (http://stackoverflow.com/questions/2409432/improving-performance-of-system-directoryservices-accountmanagement) 내 코딩 너무. DirectyServices의 많은 메소드는 'Members'와 같은 결과를 캐시하지 않으므로 매번 다시 쿼리됩니다. 현재 그룹에 속한 멤버들의리스트를 메모리 콜렉션에 복사하는 것은 실제로'g.Members.Contains' 호출의 속도를 높입니다. –

+0

@WiktorZychla는이 방법을 추가함으로써 반복 할 때마다 AD를 쿼리하지 않아도됩니다. 따라서 프로세스 속도가 빨라집니다. –

관련 문제