如何在多个OU中按组成员身份过滤用户?

时间:2013-04-04 00:58:30

标签: c# active-directory ldap directoryservices

我有一个无法在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)?

3 个答案:

答案 0 :(得分:1)

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

searcher.Filter = "(&(objectClass=user)(memberOf=myGroup))";

答案 1 :(得分:0)

您需要在搜索过滤器中包含该组的完整专有名称,因为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名用户,则需要采用更细分的方法,详细in this article

答案 2 :(得分:0)

在查询执行时看起来我想要做的事情是不可能的,因为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!
            }
        }
    }
}