我可以轻松地从我们的域广告中获取OU的列表,但我只想使用用户帐户获取OU。
我目前正在抓取OU的列表,然后通过每个列表获取用户列表和计数,但处理所有数据可能需要大约30秒。
我希望有更快捷的方法来完成同样的任务。
Public Sub GetActiveDirectoryOuList()
Dim de As DirectoryEntry = Nothing
Dim ds As DirectorySearcher = Nothing
Dim results As SearchResultCollection = Nothing
Try
de = New DirectoryEntry("LDAP://DC=csileasing,DC=com")
ds = New DirectorySearcher(de, "(objectClass=organizationalUnit)")
results = ds.FindAll
If results.Count = 0 Then Exit Try
For Each result As SearchResult In results
Dim count As Integer = GetUserCountForOU(result.Properties("distinguishedName")(0).ToString)
If count > 0 Then
Dim ou As New OrgUnitInfo
ou.DistinguisedName = result.Properties("distinguishedName")(0).ToString
ou.Name = result.Properties("name")(0).ToString
ou.UsersCount = count
adOrgUnitList.Add(ou)
End If
Next
Catch ex As Exception
'MessageBox.Show(ex.Message)
Finally
If ds IsNot Nothing Then ds.Dispose()
If de IsNot Nothing Then de.Dispose()
If results IsNot Nothing Then results.Dispose()
End Try
End Sub
答案 0 :(得分:0)
我确保我的DirectorySearcher操作要求尽可能少的数据。在搜索OU时,只需指定您要使用的参数
ds = New DirectorySearcher(de, "(objectClass=organizationalUnit)", {"distinguishedName", "name"})
也许可以尝试对你的GetUserCountForOU方法做同样的事情,如果它正在搜索具有所有属性的所有用户,那么它花费那么长时间是完全正常的。您可以使用PropertiesToLoad
指定一个空的Filter="(&(objectClass=user)(!objectClass=computer))"
数组,DirectorySearcher
只会查找objectGuid
(如果我没记错的话)。您只需计算结果条目即可获得ou.UsersCount
。