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