【问题标题】:List of users in specific Active Directory Distribution Group特定 Active Directory 通讯组中的用户列表
【发布时间】:2010-07-07 14:17:22
【问题描述】:

我正在尝试从活动目录组中获取用户列表和有关用户的一些属性。

更新:

这是我目前拥有的两种方法:

    Dim adGroup As New DirectoryEntry("LDAP://CN=MyGroup,OU=Groups,OU=Accounts,OU=All,DC=domain,DC=com")
    Dim adMembers As Object
    Dim objUser As ActiveDirectoryUser
    Dim objUserList As New List(Of ActiveDirectoryUser)
    Dim directoryEntry As DirectoryEntry

    adMembers = adGroup.Invoke("Members", Nothing)

    For Each adMember As Object In CType(adMembers, IEnumerable)
        directoryEntry = New DirectoryEntry(adMember)
        objUser = New ActiveDirectoryUser

        objUser.UserId = directoryEntry.Properties.Item("sAMAccountName").Value.ToString()
        objUser.Contract = directoryEntry.Properties.Item("ou").Value.ToString()
        objUser.LastName = directoryEntry.Properties.Item("sn").Value.ToString()
        objUser.FirstName = directoryEntry.Properties.Item("givenName").Value.ToString()
        objUser.Email = directoryEntry.Properties.Item("mail").Value.ToString()

        objUserList.Add(objUser)
    Next

第一部分有效,尽管它似乎效率很低。我的内存使用量在执行过程中不断攀升,我收到this 错误,尽管看起来可以修复。第二种方法:

    Dim results As SearchResultCollection
    Dim directoryEntry2 As New DirectoryEntry("LDAP://DC=domain,DC=com")
    Dim directorySearcher As New DirectorySearcher(directoryEntry2)
    directorySearcher.PageSize = 1000

    directorySearcher.Filter = "(&(objectCategory=person)" & _
                           "(objectClass=user)" & _
                           "(memberOf=CN=MyGroup,OU=Groups,OU=Accounts,OU=All,DC=domain,DC=com))"


    directorySearcher.PropertiesToLoad.Add("ou")
    directorySearcher.PropertiesToLoad.Add("sn")
    directorySearcher.PropertiesToLoad.Add("givenName")
    directorySearcher.PropertiesToLoad.Add("sAMAccountName")
    directorySearcher.PropertiesToLoad.Add("mail")

    results = directorySearcher.FindAll

结果计数似乎因应用程序的每次执行而异,我觉得这很奇怪。我不确定这是否是让用户返回的可靠方法,或者我是否需要修改搜索内容?

【问题讨论】:

    标签: .net active-directory


    【解决方案1】:

    如果可以,请升级到 .NET 3.5 并使用新改进的 System.DirectoryServices.AccountManagement 命名空间。在Managing Directory Security Principals in the .NET Framework 3.5 中可以找到这些新课程的精彩介绍。

    有了这个,你的工作就变得微不足道了:

    PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "YOURDOMAIN");
    GroupPrincipal group = GroupPrincipal.FindByIdentity(ctx, "MyGroup");
    PrincipalSearchResult<Principal> members = group.GetMembers();
    

    这对你有用吗?

    如果您不能使用 .NET 3.5,则应检查该组的 member 属性。组成员在层次结构中逻辑上存储为组下方的子项,因此您无法使用DirectorySearcher 找到它们。

    DirectoryEntry group = new DirectoryEntry("LDAP://CN=MyGroup,OU=Groups,OU=All,DC=Domain,DC=com");
    
    foreach(object groupMemberDN in group.Properties["member"])
    {
       // grab the group member's DN
    }
    

    在 MSDN 库中查看用于 Active Directory 的 Quick List of C# Code Examples(或用于 Visual Basic .NET)以了解此 sn-p 及更多信息。

    更新:如果您需要属于特定组的用户(因为您想更新他们的属性或其他内容),您可以反转方法:搜索所有具有与组 DN 等效的 memberOf 属性的用户:

     DirectoryEntry root = new DirectoryEntry("LDAP://dc=domain,dc=com");
     DirectorySearcher searcher = new DirectorySearcher(root);
    
     searcher.Filter = "(&(objectCategory=user)(memberOf=CN=MyGroup,OU=Groups,OU=All,DC=Domain,DC=com))";
     // set other properties on the searcher
    
     foreach(object result in searcher.FindAll())
     {
        // do whatever you need to do with the entry
     }
    

    【讨论】:

    • 循环遍历成员属性让我很接近。我仍然需要从成员对象中提取属性(名字、电子邮件等)。我假设我需要将示例中的 groupmemberDN 转换为特定的对象类型,以便从中提取属性?
    • 感谢您迄今为止的帮助。我有两个问题。首先,您曾说过我无法通过使用目录搜索器来获取成员,所以在您更新的示例中我看到我可以,所以我希望您能详细说明您的意思。其次,我可以通过使用目录搜索器获得结果,但是每次运行应用程序时,集合中的计数似乎都不同,而它应该是一致的(当前没有人被添加到组中)。
    • @Ek0nomik:您不能枚举组以查找其所有成员,因为组不是 AD 中可以枚举的容器.它不包含其成员作为子对象。但是,您可以枚举目录分支并查找属于特定组的所有用户。
    • 谢谢,但是当我的组在 OU 中定义时,过滤器不起作用,我该如何解决?
    • @Mohsen.Sharify:为您的组使用正确的专有名称 - 这将包括它所在的 OU .....
    【解决方案2】:

    扩大搜索范围,无论成员在哪里:

    Dim directoryEntry As New DirectoryEntry("LDAP://OU=All,DC=Domain,DC=com")
    

    根据组成员身份过滤:

    directorySearcher.Filter = "(&(objectCategory=person)" & _
                                 "(objectClass=user)" & _
                                 "(memberOf=CN=MyGroup,OU=Groups,OU=All,DC=Domain,DC=com))"
    

    【讨论】:

    • 如果要扩大范围,您可能需要设置 directorySearcher.PageSize = 1000。
    • 还是没有运气。我完全接受了你提供的内容,删除了我的具体值,但我没有得到任何结果。
    • @Ek0nomik - 我原来的答案有错字。我认为“memberOf”没有空格。
    • @marc_s - 我的回答与您在回答的“更新”部分中的建议有何不同?
    • 你原来的帖子是行不通的......现在你已经更正了它,它几乎和我的一样。我会将我的 LDAP 过滤器限制为 objectCategory(单值、索引)并且通常忘记 objectClass - 但除此之外,我们现在处于同一点。
    猜你喜欢
    • 1970-01-01
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多