如何使用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();
任何帮助表示赞赏!
答案 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();