我想找到某个OU中属于某个组成员的所有用户,因此我的过滤器看起来像这样:
(及(objectClass的=用户)(的memberOf = * OU =东西,OU =是的,DC = dev的,DC =本地))
有没有办法在带有通配符的memberof属性上运行directorysearcher?
答案 0 :(得分:8)
您需要将要搜索的OU设置为DirectorySearcher的根目录:
DirectoryEntry myOU = new DirectoryEntry("OU=something,OU=yep,DC=dev,DC=local");
DirectorySearcher srch = new DirectorySearcher(myOU);
srch.SearchScope = SearchScope.Subtree;
然后只使用objectCategory = person作为你的过滤器 - 我会使用objectCategory,它是单值和索引的,因此速度快而不是objectClass(它是多值的而不是索引的):
srch.Filter = "(objectCategory=person)";
如果您仍想要检查组中的成员资格以及作为OU的一部分,您可以将其作为部分成员添加到过滤器中:
srch.Filter = "(&(objectCategory=person)(memberOf=cn=Group,ou=yep,dc=dev,dc=local))";
不完全确定通配符 - 一般来说,LDAP搜索过滤器确实支持通配符,但我对在这个组DN中使用RDN中的通配符有点犹豫。
马克
答案 1 :(得分:2)
根据this thread,Active Directory不支持通配符搜索DN。
答案 2 :(得分:0)
不要指定memberOf子句。
答案 3 :(得分:0)
不要指定memberOf
子句。只需使用"(objectClass=user)"
答案 4 :(得分:0)
我是这样做的 是LDAP名称 是您需要成员的小组
DirectoryEntry entry = new DirectoryEntry("LDAP://<COMPANYLDAP>/CN=<Group Name>,OU=something,OU=yep,DC=dev,DC=local");
DirectorySearcher Dsearch = new DirectorySearcher(entry);
SearchResult sResultSet = Dsearch.FindOne();
GetProperty(sResultSet, "member");
public static void GetProperty(SearchResult searchResult, string PropertyName)
{
StringBuilder strb = new StringBuilder();
if (searchResult.Properties.Contains(PropertyName))
{
ResultPropertyValueCollection rc = searchResult.Properties[PropertyName];
foreach (string name in rc)
{
DirectoryEntry entry = new DirectoryEntry("LDAP://<COMPANYLDAP>/" + name);
DirectorySearcher Dsearch = new DirectorySearcher(entry);
//Dsearch.Filter = name;
SearchResult sResultSet = Dsearch.FindOne();
strb.AppendLine(GetPropertyvalue(sResultSet, "displayname") + "," + GetPropertyvalue(sResultSet, "mail"));
}
}
File.WriteAllText(strb.ToString(), "c:\\Users.txt");
}