Запрос LDAP для получения только подразделений, имеющих в нем хотя бы одну группу, из Active Directory

#c# #.net #active-directory

#c# #.net #active-directory

Вопрос:

Ищу запрос LDAP, чтобы получить только те подразделения из Active Directory, в которых есть группа.

наиболее важным является использование только запроса LDAP, я не хочу фильтровать каждое подразделение с помощью кода C #.

Спасибо

Комментарии:

1. ??? Любая данная группа будет существовать только в одном подразделении — это то, что вы ищете?? Или вам нужны только те подразделения, внутри которых есть хотя бы одна группа??? Не очень понятно…..

2. @marc_s только те подразделения, внутри которых есть хотя бы одна группа

Ответ №1:

Группы могут храниться в организационных подразделениях, а также в домене, контейнерах.

Используя DirectoryEntry или AccountManagement, вы можете выполнить следующее :

  1. Найдите все группы из корневого каталога домена
  2. Для каждой группы добавьте свойство контейнера в список подразделений
  3. Получение уникальных записей из списка подразделений

Вот решение, использующее 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 (родительский)?