2016-06-10 1 views
1

이 코드에 문제가 있습니다 ... 분명히 작동하지만 나에게 너무 느립니다. 아무도 아이디어가 있습니까? 다음 액세스를 시도 할 때 속도가 느려집니다.PrincipalContext를 사용하여 LDAP (Active Directory)에서 모든 사용자 이름과 해당 정보를 검색합니다.

Dim u As UserPrincipal = UserPrincipal.FindByIdentity(ctx, p.SamAccountName) 

다시 다음 코드는 제대로 작동하지만 쓰레기처럼 느립니다. 위 코드 조각을 꺼내서 p.SamAccountName을 검색하면 1 초 내에 완료됩니다. 그래서 나는 잘못된 것을하고 있다고 확신합니다.

Dim sw As New Stopwatch 

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 

    sw.Start() 

    DataGridView1.ColumnCount = 3 
    DataGridView1.Columns(0).Name = "Account Name" 
    DataGridView1.Columns(1).Name = "First Name" 
    DataGridView1.Columns(2).Name = "Last Name" 

    Dim ctx = New PrincipalContext(ContextType.Domain, "JOI", DomainName) 
    Dim userPrin As New UserPrincipal(ctx) 
    userPrin.Name = "*" 
    Dim searcher = New System.DirectoryServices.AccountManagement.PrincipalSearcher() 
    searcher.QueryFilter = userPrin 
    Dim results = searcher.FindAll() 

    For Each p As Principal In results 
     Dim u As UserPrincipal = UserPrincipal.FindByIdentity(ctx, p.SamAccountName) 
     Dim row As String() = New String() {u.SamAccountName, u.GivenName, u.Surname} 
     DataGridView1.Rows.Add(row) 
    Next 

    sw.Stop() 
    MessageBox.Show("Finished in :" & sw.Elapsed.Duration.Seconds & " seconds") 

End Sub 

Private Shared Function DomainName() As String 

    Dim objRootDSE As New DirectoryEntry("LDAP://RootDSE") 
    DomainName = objRootDSE.Properties("defaultNamingContext")(0) 

End Function 

답변

1

당신은 이미 검색에서 결과의 UserPrincipal에 액세스 할 수 있으며 당신은 결과의 각 항목에 대해 또 다른 새로운 검색을 수행하고 있습니다. 그것이 바로 당신의 기능을 늦추는 것입니다.

나는 보통 필터 (LINQ)를 필터링하고 UserPrincipal 유형의 결과 항목 만 가져옵니다. 그 방법은 검색

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 

    sw.Start() 

    DataGridView1.ColumnCount = 3 
    DataGridView1.Columns(0).Name = "Account Name" 
    DataGridView1.Columns(1).Name = "First Name" 
    DataGridView1.Columns(2).Name = "Last Name" 

    Using context As PrincipalContext = New PrincipalContext(ContextType.Domain, "JOI", DomainName) 
     Using userPrin As UserPrincipal = New UserPrincipal(context) 
      userPrin.Name = "*" 
      Using searcher As PrincipalSearcher = New PrincipalSearcher(userPrin) 

       Dim results = searcher _ 
        .FindAll() _ 
        .OfType(Of UserPrincipal)() 

       For Each p As UserPrincipal In results 
        Dim row As String() = New String() {p.SamAccountName, p.GivenName, p.Surname} 
        DataGridView1.Rows.Add(row) 
       Next 
      End Using 
     End Using 
    End Using 

    sw.Stop() 
    MessageBox.Show("Finished in :" & sw.Elapsed.Duration.Seconds & " seconds") 

End Sub 
+0

테스트를 통해 한 패스의 당신이하고있는 일을 찾고 후 나는 내 문제를 볼 수 있지만이 지금 ... 나는 그것을 보지 않았다 믿을 수 없다. 고마워. 고마워. 몇 분 안에 테스트하자 마자 해결책으로 게시됩니다. – TonyW

+0

도움 주셔서 감사합니다! 매력처럼 작동하며 전체 AD 구조에 대해 10 초에서 1 초로 진행됩니다. – TonyW

관련 문제