Учитывая такую группу в Active Directory:
MainGroup
GroupA
User1
User2
GroupB
User3
User4
Я могу легко определить, является ли User3 членом 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:
, но использование корня домена вместо пользователя в качестве базы поиска невозможно, так как запрос занимает слишком много времени (вероятно, он рекурсивно вычисляет членство в группах для всех пользователей в домене и проверяет, они входят в данную группу).
Как лучше всего получить всех членов группы, включая ее подгруппы?