Для такой группы в Active Directory:
MainGroup
GroupA
User1
User2
GroupB
User3
User4
Я могу легко определить, является ли Пользователь3 членом MainGroup или какой-либо из его подгрупп с кодом, подобным следующему:
using System;
using System.DirectoryServices;
static class Program {
static void Main() {
DirectoryEntry user = new DirectoryEntry("LDAP://CN=User3,DC=X,DC=y");
string filter = "(memberOf:1.2.840.113556.1.4.1941:=CN=MainGroup,DC=X,DC=y)";
DirectorySearcher searcher = new DirectorySearcher(user, filter);
searcher.SearchScope = SearchScope.Subtree;
var r = searcher.FindOne();
bool isMember = (r != null);
}
}
Я хотел бы знать, существует ли аналогичный способ получения всех пользователей, которые являются членами группы или любой из ее подгрупп, т. Е. В примере для MainGroup получить User1, User2, User3 и User4.
Очевидный способ получить всех пользователей - это рекурсивный запрос каждой подгруппы, но мне было интересно, есть ли более простой способ сделать это.
Использование того же подхода с фильтром memberOf:1.2.840.113556.1.4.1941:
, но использование корневого домена вместо пользователя в качестве базы поиска невозможно, поскольку запрос занимает слишком много времени (вероятно, он рекурсивно вычисляет все членство в группах для всех пользователей в домен и проверяет, являются ли они членами данной группы).
Каков наилучший способ получить всех членов группы, включая ее подгруппы?