查找子组的成员和成员

时间:2014-02-05 05:06:41

标签: asp.net active-directory ldap directoryservices directorysearcher

如何使用DirectorySearcher和Filter / PropertiesToLoad获取特定组/部门中所有成员子组成员的列表?

目前,我可以让小组返回其所有成员。但是,该组内有子组,我也无法联系到这些子组中的成员。

这是我到目前为止所做的:

        DirectoryEntry entry = null;
    entry = new DirectoryEntry("LDAP://DC=au,DC=company,DC=com", null, null, AuthenticationTypes.Secure);

    try
    {
        DirectorySearcher ouSearch = new DirectorySearcher(entry);
        ouSearch.Filter = "(&(objectClass=user)(objectCategory=person)(displayName=*" + username + "*)" +
        "(|" +
            "(memberOf=CN=my department,OU=ADC-Distribution Groups,DC=au,DC=company,DC=com)" +

        ")" +

        ")";

        ouSearch.PropertiesToLoad.Add("samAccountName");
        ouSearch.PropertiesToLoad.Add("displayName");
        ouSearch.PropertiesToLoad.Add("memberOf");
        ouSearch.SearchScope = SearchScope.Subtree;

        SearchResultCollection allOUS = ouSearch.FindAll();

任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:1)

您必须以递归方式扩展每个属于另一个组成员的子组。

但是,使用System.DirectoryServices.AccountManagement命名空间的GroupPrincipal类有一个更简单的方法。

GroupPrincipal有一个方法GetMembers,允许您以递归方式检索组中的所有成员。您所要做的就是将true指定为GetMembers的唯一参数。

以下示例是从MSDN复制的:

PrincipalContext ctx = new PrincipalContext(ContextType.Domain,                                                                    
                                        "fabrikam.com", 
                                        "DC=fabrikam,DC=com", 
                                        "administrator", 
                                        "SecretPwd123");

GroupPrincipal grp = GroupPrincipal.FindByIdentity(ctx, 
                                               IdentityType.Name, 
                                               "Domain Admins");

if (grp != null)
{
    foreach (Principal p in grp.GetMembers(recursive: true))
    {
        Console.WriteLine(p.Name);
    }
    grp.Dispose();
}

ctx.Dispose();