Given grupę tak w usłudze Active Directory:Get członków grupy Active Directory, rekursywnie, czyli łącznie z podgrupami
MainGroup
GroupA
User1
User2
GroupB
User3
User4
można łatwo ustalić, czy User3 jest członkiem MainGroup lub jej podgrup z kodem jak ta :
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);
}
}
chciałbym wiedzieć, czy istnieje podobny sposób uzyskać wszystkich użytkowników, które są członkiem grupy lub któregokolwiek z jej podgrup, czyli w przykładzie dla MainGroup dostać User1, Użytkownik2, User3 i użytkownik4 .
Oczywistym sposobem na uzyskanie wszystkich użytkowników jest rekursywne zapytanie każdej podgrupy, ale zastanawiałem się, czy jest łatwiejszy sposób.
Stosując takie samo podejście z filtrem memberOf:1.2.840.113556.1.4.1941:
, ale korzystając z korzenia domeny zamiast użytkownika jako podstawy wyszukiwania nie jest wykonalne, jako zapytanie trwa zbyt długo (prawdopodobnie to oblicza wszystkie członkostwa grupy rekursywnie dla wszystkich użytkowników w domena i sprawdza, czy są członkami danej grupy).
Jaki jest najlepszy sposób na uzyskanie wszystkich członków grupy, w tym jej podgrup?
Ten post został tu na chwilę, ale chciałem dodać dzięki za komentarz odpowiedź. Właśnie spotkałem się z tym samym problemem, a ja zamierzam to wypróbować. – Steven
Nie wiem, czy to zobaczysz (lub nawet, jeśli jest to najbardziej odpowiedni sposób zadawania takich pytań, ale mam problemy z uruchomieniem tego, i myślę, że to prawdopodobnie z powodu mojego braku Zrozumienie AD Kiedy otrzymuję odrębną nazwę (DN) mojej grupy, to zwraca ona coś takiego: "CN =, OU = , OU = Lista dystrybucyjna, OU = Usługi Exchange, OU = Podstawowe usługi katalogowe, DC = , DC = com 'Ale kiedy próbowałem dotrzeć do tego (lub tego bez wiodącego "CN ="), dostaję "Nieokreślony błąd" w punkcie, w którym poszukiwacz iterował przez FindAll() –
Steven
@Steven: Myślę, że najlepiej byłoby opublikować nowe pytanie (z linkiem do tego, jeśli jest to problem pokrewny). W tej chwili nie mogę ci pomóc, ponieważ brakuje mi domeny do przetestowania, przepraszam :) –