LDAP-запрос для получения из Active Directory только подразделений, имеющих хотя бы одну группу - PullRequest
1 голос
/ 18 октября 2011

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

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

Спасибо

Ответы [ 2 ]

0 голосов
/ 21 октября 2011

Это невозможно при одном поиске. Вам нужно будет захватить каждое подразделение и затем выполнить одноуровневый поиск этого подразделения (& (objectCategory = group) (objectClass = group)). Это не будет особенно эффективно, если учесть, сколько запросов вам может понадобиться выполнить. Также подумайте, нужно ли вам обрабатывать сценарий, в котором у вас OU = A \ OU = B. Если OU = B включает группу, включаете ли вы OU = A (родитель)?

0 голосов
/ 18 октября 2011

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

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

  1. Найти все группы из корневого домена
  2. Группа Foreach добавляет свойство контейнера в список подразделений
  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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...