仅显示包含用户帐户的Active Directory OU

时间:2016-09-26 17:27:20

标签: vb.net winforms directoryservices

我可以轻松地从我们的域广告中获取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

1 个答案:

答案 0 :(得分:0)

我确保我的DirectorySearcher操作要求尽可能少的数据。在搜索OU时,只需指定您要使用的参数

ds = New DirectorySearcher(de, "(objectClass=organizationalUnit)", {"distinguishedName", "name"})

也许可以尝试对你的GetUserCountForOU方法做同样的事情,如果它正在搜索具有所有属性的所有用户,那么它花费那么长时间是完全正常的。您可以使用PropertiesToLoad指定一个空的Filter="(&(objectClass=user)(!objectClass=computer))"数组,DirectorySearcher只会查找objectGuid(如果我没记错的话)。您只需计算结果条目即可获得ou.UsersCount