具有MemberOf属性的LDAP DirectorySearcher

时间:2009-10-02 17:13:22

标签: c# active-directory ldap

我想找到某个OU中属于某个组成员的所有用户,因此我的过滤器看起来像这样:

(及(objectClass的=用户)(的memberOf = * OU =东西,OU =是的,DC = dev的,DC =本地))

有没有办法在带有通配符的memberof属性上运行directorysearcher?

5 个答案:

答案 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");
        }