将WPF组合框与Active Directory用户填充时间过长

时间:2012-11-12 17:51:13

标签: wpf vb.net performance combobox active-directory

我有一个绑定到数据表的组合框,我用活动目录中的用户名填充。此代码大约需要一分钟才能完成。有没有更好的方法让我失踪?

Function users() As DataTable
    Dim dt As DataTable
    Dim dr As DataRow
    Dim idCoulumn As DataColumn
    Dim nameCoulumn As DataColumn

    Dim dirEntry As New System.DirectoryServices.DirectoryEntry("LDAP://CN=Users,DC=myDomain,DC=local")

    Dim oSearcher As DirectorySearcher = New DirectorySearcher(dirEntry)
    Dim oResults As SearchResultCollection

    oSearcher.PropertiesToLoad.Add("samAccountName")
    oSearcher.PropertiesToLoad.Add("givenname")
    oSearcher.PropertiesToLoad.Add("sn")
    oSearcher.PropertiesToLoad.Add("cn")
    oSearcher.Filter = "objectCategory=person"
    oResults = oSearcher.FindAll

    dt = New DataTable()
    idCoulumn = New DataColumn("ID", Type.GetType("System.String"))
    nameCoulumn = New DataColumn("Name", Type.GetType("System.String"))

    dt.Columns.Add(idCoulumn)
    dt.Columns.Add(nameCoulumn)

    For Each oResult In oResults
        With oResult.GetDirectoryEntry()
            If .Properties("cn").Value <> "" AndAlso .Properties("samAccountName").Value <> "" AndAlso .Properties("sn").Value <> "" Then
                dr = dt.NewRow()
                dr("ID") = .Properties("samAccountName").Value
                dr("Name") = String.Format("{0},{1} : {2}", .Properties("sn").Value, .Properties("givenname").Value, .Properties("samAccountName").Value)
                dt.Rows.Add(dr)
            End If
        End With
    Next

    dt.DefaultView.Sort = "Name"

    Return dt

End Function

2 个答案:

答案 0 :(得分:2)

不要包含sn和cn属性,请尝试下面的过滤器并删除if。

(&(objectCategory=user)(objectClass=user)(samAccountName=*))

此查询具有现有samAccount名称的所有用户。这应该消除对if语句的需要并检查SN或CN。您也可以考虑绑定到比Datatable更轻的东西。

除此之外,您的代码看起来非常紧凑。你可能只需将它放在自己的线程中。

答案 1 :(得分:1)

@Spevy帮助我用他提出的答案来解决这个问题。

我将目录条目更改为:

Dim dirEntry As New System.DirectoryServices.DirectoryEntry("LDAP://myDomain")

我设置了搜索过滤器:

oSearcher.Filter = "(&(objectCategory=user)(objectClass=user))"

并将我的if语句改为:

If .Properties("samAccountName").Value <> "" AndAlso .Properties("sn").Value <> "" Then

我不确定添加这些代码行的确是做什么但我得到的结果是否相同,所以我删除了它们:

oSearcher.PropertiesToLoad.Add("samAccountName")
oSearcher.PropertiesToLoad.Add("givenname")
oSearcher.PropertiesToLoad.Add("sn")
oSearcher.PropertiesToLoad.Add("cn")