【问题标题】:How do I get the users that belong to a group in Active Directory?如何获取属于 Active Directory 中某个组的用户?
【发布时间】:2013-02-05 14:55:48
【问题描述】:

我有一个下拉列表,我试图用属于 Active Directory 中某个组的用户来填充它。

组名为 OverRiders,该组有 8 人。可以添加更多成员。

我有以下下拉菜单,但我运行代码,下拉菜单是空白的。

我做错了什么?

请看代码:

        Private Sub FillDropdown()
    Dim oroot As DirectoryEntry = New DirectoryEntry("LDAP://CN=OverRiders,OU=Departments,DC=domain,DC=com")
Dim osearcher As DirectorySearcher = New DirectorySearcher(oroot)
Dim oresult As SearchResultCollection
Dim result As SearchResult
Dim list As New List(Of String)

    osearcher.Filter = "(&(objectCategory=group)(cn={0}))"
    ' search filter; only display emp with firstname / lastname pair
    osearcher.PropertiesToLoad.Add("name") ' member
    oresult = osearcher.FindAll()


    For Each result In oresult
        If Not result.GetDirectoryEntry.Properties("name").Value Is Nothing Then
            list.Add(result.GetDirectoryEntry.Properties("name").Value.ToString())
            Call list.Sort()
        End If
Next
emplist.DataSource = list
emplist.DataBind()

End Sub

我已经能够确认该组确实存在并且组名有效。 提前非常感谢

【问题讨论】:

  • 您需要首先检查您的 oresult 对象是否为空。如果是,则您的 LDAP 搜索过滤器无法正常工作。如果不是,则您要查找的属性不存在。找出来并告诉我们。
  • 我已经完成了这些检查。这有问题:'osearcher.Filter = "(&(objectCategory=group)(cn={0}))"' 我不确定 objectcategory 应该是什么或是否应该有 objectClass。希望有经验的高手能帮帮我。老实说,我并没有很难弄清楚我做错了什么。
  • 我只能凭经验说话;我用于 Intranet 电话目录应用程序的 LDAP 查询是 (&(objectClass=person)(telephoneNumber=*),然后我根据用户搜索的内容添加一个或多个过滤器(即 (SN="surname"*) ). 我会先尝试 objectCategory / objectClass 查询,看看您是否得到了 AD 的响应,然后再尝试进一步缩小范围。
  • 我有另一个完美的下拉列表。我在上面发布的这个下拉列表与完美运行的下拉列表之间的唯一区别是,我发布的这个下拉列表正在寻找特定组的用户,而有效的下拉列表仅查询 Active Directory 中的所有用户。所以,我想我肯定需要对对象类别和类进行一些调整。
  • 听起来像。也许您可以只使用有效的查询并在 System.DirectoryServices 之外编写自己的过滤器来查找您需要的内容?不是最优的,但仍然是一个解决方案。

标签: vb.net active-directory ldap


【解决方案1】:

改变:

Dim oroot As DirectoryEntry = New DirectoryEntry("LDAP://CN=OverRiders,OU=Departments,DC=domain,DC=com")

到

Dim oroot As DirectoryEntry = New DirectoryEntry("LDAP://DC=domain,DC=com")

还有这个:

osearcher.Filter = "(&(objectCategory=group)(cn={0}))"

到这里:

osearcher.Filter = "(&(objectCategory=user)(memberOf=CN=overRiders,OU=Departments,DC=domain,DC=com)‌​)"

其他一切都保持不变。

希望对其他人有所帮助。

【讨论】:

    【解决方案2】:

    我知道这是一个老问题,但在类似情况下这对我有用:

        Dim UsersInGroup As New Collection()
    
        Dim de As New DirectoryEntry("LDAP://[Domain]")
    
        Dim MemberSearcher As New DirectorySearcher
    
        With MemberSearcher
            .SearchRoot = de
            .Filter = "(&(ObjectClass=Group)(CN=" & Group & "))"
            .PropertiesToLoad.Add("Member")
        End With
    
        Dim mySearchResults As SearchResult = MemberSearcher.FindOne()
    
        For Each User In mySearchResults.Properties("Member")
            UsersInGroup.Add(User)
        Next
    

    【讨论】:

    • 嗨,Michael,我的 AD 目录名称应该放在这里吗?
    • 我通常使用rootdse。这将使它适用于您登录的任何域。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-09
    • 1970-01-01
    • 1970-01-01
    • 2018-06-26
    • 1970-01-01
    相关资源
    最近更新 更多