1

我有一个无法在 OU 级别完成的用户查询。我试图只返回他们是组成员的用户(我需要按组字符串值过滤,而不是实际的组对象)。这是它目前的样子:

using (var entry = new DirectoryEntry("LDAP://foo.net/DC=appName,DC=domainName,DC=com", Username, Password)) {
    using (var searcher = new DirectorySearcher()) {
        searcher.Filter = "(&(objectClass=user))";
        searcher.SearchRoot = entry;
        searcher.PropertiesToLoad.Add("memberOf");

        foreach (SearchResult sr in searcher.FindAll()) {
            var member = GetSearchResultProperty(sr, "memberOf");
        }
    }
}

此查询跨越多个 OU,其中有不同的用户和组容器。

memberOf当我执行查询时(不指定任何类型的 OU),有没有办法可以过滤属性?

4

3 回答 3

1

只需在过滤器中添加另一个术语:

searcher.Filter = "(&(objectClass=user)(memberOf=myGroup))";
于 2013-04-04T01:07:12.333 回答
1

您需要在搜索过滤器中包含组的完整可分辨名称,因为 memberOf 属性将包含该值。

searcher.Filter = "(&(objectClass=user)(memberOf=CN=myGroup,CN=groups,OU=theOU,DC=appName,DC=domainName,DC=com))";

编辑 :

我很抱歉,因为我误读了这个问题。在不包括 OU 的情况下,唯一的其他方法是采用相反的方法,并首先定位组对象:

searcher.Filter = "(&(objectClass=group)(name=Your Group Name)"

然后遍历DirectoryEntry使用它的属性:

foreach(object dn in group.Properties["member"] )
{
    string DistinguishedName = dn.ToString();
}

但是,如果您要检索 1,000 多个用户,则需要采用更加细分的方法,本文对此进行了详细介绍。

于 2013-04-04T15:40:20.917 回答
1

在执行查询时,我尝试执行的操作似乎是不可能的,因为该memberOf属性需要是组的完整路径。就我而言,我实际上并不关心组对象,而是组名(每个 OU 将有不同的组,但可以具有相同的组名)。我不得不采取不同的方法来解决这个问题,这可能会对以后的性能产生影响。以防万一其他人发现这个问题正在寻找答案,这是我现在解决它的方法:

using (var entry = new DirectoryEntry("LDAP://foo.net/DC=appName,DC=domainName,DC=com", Username, Password)) {
    using (var searcher = new DirectorySearcher()) {
        searcher.Filter = "(&(objectClass=user))";
        searcher.SearchRoot = entry;
        searcher.PageSize = 5000;
        searcher.PropertiesToLoad.Add(DirectoryConstants.AD_PROPERTY_MEMBER_OF);
        searcher.PropertiesToLoad.Add(DirectoryConstants.AD_PROPERTY_DISPLAY_NAME);

        foreach (SearchResult sr in searcher.FindAll()) {
            //The memberOf property will be a string array if the user is in multiple groups.
            string[] memberOf = GetSearchResultProperties(sr, DirectoryConstants.AD_PROPERTY_MEMBER_OF);
            //Check if the user is in the group by analyzing the string.
            var group = memberOf.FirstOrDefault(m => m.StartsWith(string.Format("CN={0},", groupName)));

            if (group != null) {
                //The user is in the group!
            }
        }
    }
}
于 2013-04-05T13:56:14.623 回答