C# 我如何通过多个OU';s
我有一个用户查询无法在OU级别完成。我试图只返回他们是组成员的用户(我需要按组字符串值过滤,而不是实际的组对象)。以下是它当前的样子: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
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级别执行搜索,所以,看起来不可能按我想要的方式对组进行筛选。