1

我需要在我的程序中获取组中的用户登录名列表。

这是我到目前为止所拥有的,但它只返回所有用户......我需要将其缩减为一组中的用户,其中我有这个名称。

Option Explicit On
Imports System.DirectoryServices
Imports System.DirectoryServices.ActiveDirectory

Module Module1
    Sub Main()
        Dim ADEntry As New DirectoryServices.DirectoryEntry("LDAP://OU=Users,OU=Irvine,OU=KNS,DC=corp,DC=kns,DC=com")
        Dim objSearch As New System.DirectoryServices.DirectorySearcher(ADEntry)

        Dim oResults As DirectoryServices.SearchResultCollection
        Dim oResult As DirectoryServices.SearchResult

        '  THIS DOESNT WORK
        '  objSearch.Filter = "department = engineering"

        oResults = objSearch.FindAll

        For Each oResult In oResults
            Console.WriteLine(oResult.GetDirectoryEntry.Properties("sAMAccountName").Value)
        Next
    End Sub
End Module
4

4 回答 4

1

如果你想要一个组的所有成员,试试这个:

1)绑定到组:

DirectoryEntry theGroup = 
   new DirectoryEntry("LDAP://cn=YourGroupname,ou=SomeOU,dc=YourCompany,dc=com");

2)然后,枚举其成员 - 它是组的“成员”属性DirectoryEntry

foreach(object dn in theGroup.Properties["member"])
{
   Console.WriteLine(dn);
}

组的“成员”属性中的每个条目都应该是其成员(用户或其他组)的完整 DN(专有名称)。

您的问题是您正在尝试枚举组的成员 - 但您的代码看起来更像是您正在尝试枚举 OU(组织单元)内的所有内容 - 这两个任务完全不同!你真正需要哪个?

您可以在 MSDN 库上找到Visual Basic.NET 代码示例的快速列表,或者您可以在 CodeProject 上了解有关如何在 Active Directory 中执行几乎所有操作的更多信息(带有 C# 示例)。

马克

于 2009-12-08T21:48:47.973 回答
1

尝试将文件管理器更改为

objSearch.Filter = "(&(objectCategory=user)(memberOf=CN=Employees,OU=Security Groups,DC=yourdomain,DC=com))"

该组是员工。

来源:如何编写 LDAP 搜索过滤器

注意:我无法对此进行测试。让我知道它是否有效。

于 2009-12-08T18:28:09.843 回答
0
    Dim ADEntry As New DirectoryServices.DirectoryEntry("LDAP://ou=users,ou=irvine,ou=kns,dc=corp,dc=kns,dc=com")
    Dim objSearch As New System.DirectoryServices.DirectorySearcher(ADEntry)

    Dim oResults As DirectoryServices.SearchResultCollection
    Dim oResult As DirectoryServices.SearchResult

    objSearch.Filter = "(&(objectCategory=person)(objectClass=user)(department=Engineering)(!userAccountControl:1.2.840.113556.1.4.803:=2))"
    oResults = objSearch.FindAll

    For Each oResult In oResults
        Console.WriteLine(oResult.GetDirectoryEntry.Properties("sAMAccountName").Value)
    Next

这有效!

于 2009-12-10T00:04:04.367 回答
0

几年前,我构建了一个我们经常用于此任务的 AD 组件。尝试这个。

Public Function GetUsersInGroup(ByVal GroupName As String) As String()
        If GroupName = String.Empty Then Return Nothing
        Dim Users() As String = Nothing
        Dim S As String = "LDAP://DC=YourCompany,DC=com"
        Dim Parent As New DirectoryServices.DirectoryEntry(S)
        Dim Search As New DirectoryServices.DirectorySearcher(Parent)

        Search.SearchScope = DirectoryServices.SearchScope.Subtree
        Search.Filter = "(CN=" & GroupName & ")"
        Search.PropertiesToLoad.Add("member")

        Dim Result As DirectoryServices.SearchResult = Search.FindOne
        Dim prop_value As String, i As Integer = 0
        If Result IsNot Nothing Then
            If Result.Properties("member").Count > 0 Then
                ReDim Users(Result.Properties("member").Count - 1)
                For Each prop_value In Result.Properties("member")
                    Dim S2 As New DirectoryServices.DirectorySearcher(Parent)
                    S2.SearchScope = DirectoryServices.SearchScope.Subtree
                    S2.Filter = "(" & prop_value.Substring(0, prop_value.IndexOf(","c)) & ")"
                    S2.PropertiesToLoad.Add("SAMAccountName")
                    Dim R2 As DirectoryServices.SearchResult = S2.FindOne
                    For Each Prop As String In R2.Properties("SAMAccountName")
                        Users(i) = Prop.ToUpper
                        i = i + 1
                    Next
                Next
                Exit For
            End If
        End If
End Function

如果您知道在哪里查找,可以从 AD 中提取大量信息。

于 2009-12-10T17:18:32.487 回答