C# 我如何通过多个OU';s

C# 我如何通过多个OU';s,c#,active-directory,ldap,directoryservices,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.F

我有一个用户查询无法在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,其中存在不同的用户和组容器


当我执行查询时(不指定任何OU类型),是否有一种方法可以对
memberOf
属性进行筛选?

只需在筛选中添加另一个术语:

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

您需要在搜索筛选器中包含组的完整可分辨名称,因为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)"
然后使用目录条目的属性遍历它:

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

但是,如果您要检索超过1000个用户,则需要采取更为分段的方法,这一点非常详细

在执行查询时,我试图执行的操作似乎不可能,因为
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!
            }
        }
    }
}

这不管用。我相信的
成员可能需要完整的组对象路径,而不仅仅是名称。如果我只使用
user
过滤器,我将返回多个OU中的所有用户。但是,一旦我像上面建议的那样将组名添加到过滤器中,我就不会得到任何结果。这是一个显示广告资源管理器组成员身份的字符串:
CN=myGroup,CN=groups,OU=theOU,DC=appName,DC=domainName,DC=com
在我的原始帖子中,我说我不能在OU级别执行搜索,所以,看起来不可能按我想要的方式对组进行筛选。