Запрос 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();