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