Мне нужно получить каждого пользователя, в котором memberof содержит OU = группы, OU = CR 1, DC = zcam, DC = ztech (user1 и user2 из моего примера)
Если японять правильно, я думаю, что предложение подводит итог того, что вы пытаетесь сделать.Вы хотите найти всех пользователей, которые являются членами любой группы в этом подразделении.
Active Directory не позволяет использовать подстановочные знаки для любого атрибута, который принимает distinguishedName
.Это включает в себя member
и memberOf
.Таким образом, единственный способ сделать это состоит из двух шагов:
- Найти
distinguishedName
всех групп в этом подразделении. - Поиск всех пользователей, у которых
memberOf
включает одного иззначения, найденные в шаге 1.
Примерно так (я не проверял это на AD, поэтому вам может потребоваться настроить его):
var groupSearch = new DirectorySearcher(
new DirectoryEntry("LDAP://OU=Groupes,OU=CR 1,DC=zcam,DC=ztech"), //notice the OU
"(objectClass=group)");
//if you don't do this, it will return *every* attribute, which is slower
groupSearch.PropertiesToLoad.Add("distinguishedName");
//build a user query with all the groups
var userFilter = new StringBuilder("(&(objectClass=user)(|");
using (var results = groupSearch.FindAll()) {
foreach (SearchResult result in results) {
userFilter.Append($"(memberOf={result.Properties["distinguishedName"][0]})");
}
}
userFilter.Append(")");
var userSearch = new DirectorySearcher(
new DirectoryEntry("LDAP://DC=zcam,DC=ztech"),
userFilter.ToString());
//userSearch.PropertiesToLoad.Add(""); //add only the attributes you need to make it quicker
using (var results = userSearch.FindAll()) {
foreach (SearchResult result in results) {
//do something
}
}
Обратите внимание, что этонайдет только прямых членов этих групп.Он не вернет пользователей, которые находятся во вложенных группах (когда пользователь находится в группе, которая является членом одной из этих групп).Если вы хотите этого, вы можете настроить фильтр так, чтобы он включал специальный флаг, который предписывает AD выполнять рекурсивный поиск:
userFilter.Append($"(memberOf:1.2.840.113556.1.4.1941:={result.Properties["distinguishedName"][0]})");
В зависимости от вашего домена вам может потребоваться знать две вещи:
- Это не вернет пользователей, которые имеют одну из этих групп в качестве своей основной группы, так как это отношение не сохраняется с использованием
member
/ memberOf
. - Если в этих группах есть члены из внешних доверенныхдоменов, тогда вы в конечном итоге найдете объекты Foreign Security Principal вместо их реальных пользовательских объектов.Это совсем другое дело, если это проблема для вас.
Я написал несколько статей на эту тему, если вам интересно.Начните с этого: Active Directory: что делает члена участником?