特定Active Directory通讯组中的用户列表

时间:2010-07-07 14:17:22

标签: .net active-directory

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

更新

以下是我目前使用的两种方法:

    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

结果计数似乎与应用程序的每次执行都有所不同,我觉得很奇怪。我不确定这是否是一种让用户恢复的可靠方式,或者我是否需要修改我的搜索内容?

2 个答案:

答案 0 :(得分:15)

如果可以,请升级到.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库中的Quick List of C# Code Examples以获取Active Directory(或Visual Basic .NET的相同内容)以获取此代码段。

更新:如果您需要属于特定群组的用户(因为您要更新其属性或其他内容),您可以采取相反的方法:搜索所有具有memberOf属性的用户,该属性等同于组的DN:

 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
 }

答案 1 :(得分: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))"