Запрос LDAP для всех пользователей в sub OUs в определенном OU

active directory, с которым я имею дело, выложен как таковой: домен содержит много OUs. Один из этих OUs называется "первичный OU". Внутри этого OU несколько ous названных с расположением глобальных офисов (ie "Чикаго" "Париж").

любая учетная запись пользователя, которая является фактическим человеком из плоти и кости, помещается в OU, названный для офиса, в котором они работают в качестве основного OU. Любая учетная запись пользователя, которая является псевдонимом, общей учетной записью или иным образом не привязана к реальному лицу, имеет "Первичный OU" ou установлен как их первичный OU.

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

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

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

есть ли способ запросить всех пользователей в пределах определенного ou " sub " OUs, но не возвращать пользователей непосредственно в Родительском OU?

2 ответов


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

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) вернуть список

Марк


// 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();