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

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

У меня есть пользователь "Джон". "Джон" является членом группы "А". Группа "B" имеет группу "A" в качестве участника.

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

Когда я получаю группу Джона, я получаю только "А", а не "В", делая это так:

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();

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

Спасибо!

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 группы, которую я нахожу по имени.

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

Другие вопросы по тегам