Получить группы пользователей в 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 группы, которую я нахожу по имени.
Большое спасибо за вашу помощь!