2016-06-10 73 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

谢谢你的帮助!像魅力一样,从10秒到1整个AD结构。 – TonyW

相关问题