Запрос LDAP для всех пользователей в подразделениях в пределах конкретного подразделения - PullRequest
7 голосов
/ 26 июня 2009

Активный каталог, с которым мне приходится иметь дело, выложен так: домен содержит много OU. Одно из этих подразделений называется «Основное подразделение». В этом подразделении есть несколько подразделений, названных по месту нахождения глобальных офисов (например, «Чикаго», «Париж»).

Любая учетная запись пользователя, которая является настоящим человеком из плоти и кости, помещается в подразделение, названное для офиса, в котором они работают, в качестве основного подразделения. Любая учетная запись пользователя, которая является псевдонимом, общей учетной записью или иным образом не связана напрямую с реальным человеком, в качестве основного OU установлена ​​OU «Primary OU».

В отношении данных это основное различие OU - единственное, что указывает, какие пользователи являются реальными людьми, а какие нет. Нет группы, которая содержит только реальных людей, ни в одном поле не указано, являются ли они настоящими людьми или нет, и внесение каких-либо изменений в активный каталог или любые учетные записи пользователей строго запрещено.

Моя задача - написать запрос, который получит только всех настоящих людей из плоти и костей.

К сожалению, LDAP - не совсем моя сильная сторона, и единственный способ, которым я придумал, - это поиск в каждом из этих подразделений офисов по отдельности и объединение всех результатов, но есть много офисов, и это потребовало бы изменения к запросу, если какие-либо офисы были добавлены, что мне нужно избегать.

Существует ли способ опрашивать всех пользователей в подразделениях "sub" определенного подразделения, но не возвращать пользователей напрямую в родительское подразделение?

Ответы [ 2 ]

11 голосов
/ 26 июня 2009

Да, конечно - вам нужно:

1) Привязка к определенной OU

DirectoryEntry myOU = new DirectoryEntry("LDAP://OU=MyOU,......,DC=MyCompany,DC=com");

2) Перечислить все его подчиненные подразделения

DirectorySearcher subOUsearcher = new DirectorySearcher(myOU);
subOUsearcher.SearchScope = SearchScope.OneLevel; // don't recurse down
subOUsearcher.Filter = "(objectClass=organizationalUnit)";

foreach(SearchResult subOU in subOUsearcher.FindAll())
{
   // stick those Sub OU's into a list and then handle them
}

3) Один за другим перечислите всех пользователей в каждом из подразделений и вставьте их в глобальный список пользователей

DirectorySearcher userSearcher = new DirectorySearcher(myCurrentSubOu);
userSearcher.SearchScope = SearchScope.OneLevel; // don't recurse down
userSearcher.Filter = "(objectClass=user)";

foreach(SearchResult user in userSearcher.FindAll())
{
  // stick those users into a list being built up
}

4) Вернуть этот список

Марк

6 голосов
/ 06 августа 2012
// Create a new DirectorySearcher that starts at the root.
// You can start it anywhere you want though
//     by providing a value in the DirectoryEntry constructor.
DirectorySearcher searcher = new DirectorySearcher(new DirectoryEntry());

// Set the scope to Subtree in order to search all children.
searcher.SearchScope = SearchScope.Subtree;

// Set the filter to only look for Organizational Units
//     that have the name you are looking for.
searcher.Filter = "(&(objectClass=organizationalUnit)(name=" + ouName + "))";

// If you are looking for only one result then do the following two things.
SearchResult result = searcher.FindOne();

DirectoryEntry newDir = result.GetDirectoryEntry();
...