#c# #.net #active-directory
#c# #.net #active-directory
Вопрос:
Ищу запрос LDAP, чтобы получить только те подразделения из Active Directory, в которых есть группа.
наиболее важным является использование только запроса LDAP, я не хочу фильтровать каждое подразделение с помощью кода C #.
Спасибо
Комментарии:
1. ??? Любая данная группа будет существовать только в одном подразделении — это то, что вы ищете?? Или вам нужны только те подразделения, внутри которых есть хотя бы одна группа??? Не очень понятно…..
2. @marc_s только те подразделения, внутри которых есть хотя бы одна группа
Ответ №1:
Группы могут храниться в организационных подразделениях, а также в домене, контейнерах.
Используя DirectoryEntry или AccountManagement, вы можете выполнить следующее :
- Найдите все группы из корневого каталога домена
- Для каждой группы добавьте свойство контейнера в список подразделений
- Получение уникальных записей из списка подразделений
Вот решение, использующее System.DirectoryServices.AccountManagement
и System.DirectoryServices
/* Retreiving a principal context
*/
PrincipalContext domainContext = new PrincipalContext(ContextType.Domain, "WM2008R2ENT:389", "dc=dom,dc=fr", "jpb", "PWD");
/* Look for all the groups from the root
*/
GroupPrincipal allGroups = new GroupPrincipal(domainContext);
allGroups.Name = "*";
/* Bind a searcher
*/
PrincipalSearcher searcher = new PrincipalSearcher();
searcher.QueryFilter = allGroups;
PrincipalSearchResult<Principal> hRes = searcher.FindAll();
/* Read The result
*/
List<DirectoryEntry> listContainerWithGroups = new List<DirectoryEntry>();
foreach (GroupPrincipal grp in hRes)
{
DirectoryEntry deGrp = grp.GetUnderlyingObject() as DirectoryEntry;
if (deGrp != null)
listContainerWithGroups.Add(deGrp.Parent);
}
/* Get Unique Entries
*/
var listContainerWithGroupsUnique = from o in listContainerWithGroups
group o by o.Properties["distinguishedName"].Value into dePackets
select dePackets.First();
foreach (DirectoryEntry deTmp in listContainerWithGroupsUnique)
{
Console.WriteLine(deTmp.Properties["distinguishedName"].Value);
}
Ответ №2:
Это невозможно с помощью одного поиска. Вам нужно будет захватить каждое подразделение, а затем выполнить одноуровневый поиск в этом подразделении для (amp;(objectCategory=group)(objectClass=group)). Это не будет особенно эффективным, если учесть, сколько поисков вам может потребоваться выполнить. Также подумайте, нужно ли вам обрабатывать сценарий, в котором у вас есть OU = A OU = B. Если OU = B включает группу, включаете ли вы OU =A (родительский)?