Получить группы пользователей в AD с вложенными группами

Я не знаю, подходит ли слово «вложенный» для того, что мне нужно, но вот объяснение:

У меня есть пользователь "Джон". «Джон» является участником группы «А». В состав группы «Б» входит группа «А».

Итак, транзитивно, «Джон» также должен быть членом группы «Б».

Когда я получаю группу Джона, я получаю только «A», а не «B», делая это следующим образом:

DirectorySearcher searcher = new DirectorySearcher();
DirectoryEntry rootEntry = new DirectoryEntry(_ldap, _loginName, _password, AuthenticationTypes.ReadonlyServer);

searcher.SearchRoot = rootEntry;
searcher.SearchScope = SearchScope.Subtree;
searcher.Filter = "(&(sAMAccountName=" + filter.Split('\\')[1] + ")(objectClass=user))";
searcher.PropertiesToLoad.Add("memberOf");
searcher.PropertiesToLoad.Add("displayname");

SearchResult sr = searcher.FindOne();

Как я могу этого добиться?

Спасибо!


person Nicole    schedule 04.12.2014    source источник
comment
Перечисление вложенных групп пользователей в AD проверьте этот предыдущий выкладываю Nicole   -  person MethodMan    schedule 04.12.2014
comment
Это не то же самое, потому что я начинаю с пользователя, я получаю его прямые группы, и мне нужно знать, является ли какая-либо из этих групп одновременно членом другой группы.   -  person Nicole    schedule 04.12.2014
comment
это случай опечатки/жирной аппликатуры в вашем фильтре="(&(sAmAccountName не уверен, имеет ли это значение, но я думаю, что это должно быть samAccountName также вы можете также добавить && (objectClass=groups))   -  person MethodMan    schedule 04.12.2014
comment
эй, проверьте это с помощью PrincipalContext. Я не уверен, поможет ли то, что я сделал ранее, или нет указанная группа-в-c-sharp/14762881#14762881" title="поиск пользователей Active Directory только в указанной группе в C Sharp"> stackoverflow.com/questions/14762653/   -  person MethodMan    schedule 05.12.2014


Ответы (1)


В итоге я использовал свойство «tokenGroups» пользователя, которое, похоже, возвращает все группы, в которых находится пользователь, даже те, в которых он транзитивно состоит.

вот мой код:

DirectorySearcher searcher = new DirectorySearcher();
DirectoryEntry rootEntry = new DirectoryEntry(_ldap, _loginName, _password, AuthenticationTypes.ReadonlyServer);

searcher.SearchRoot = rootEntry;
searcher.SearchScope = SearchScope.Subtree;
searcher.Filter = "(&(sAMAccountName=" + filter.Split('\\')[1] + ")(objectClass=user))";
searcher.PropertiesToLoad.Add("memberOf");
searcher.PropertiesToLoad.Add("displayname");

SearchResult sr = searcher.FindOne();
DirectoryEntry userDirectoryEntry = result.GetDirectoryEntry();
userDirectoryEntry.RefreshCache(new string[] { "tokenGroups" });

foreach (byte[] byteEntry in userDirectoryEntry.Properties["tokenGroups"])
{
   if (CompareByteArrays(byteEntry, objectSid))
   {
         isMember = true;
         break;
   }
}

Это сочетание этого и эта ссылка, где objectSid — это objectSID группа, которую я нахожу по названию.

Спасибо большое за вашу помощь!

person Nicole    schedule 05.12.2014