Как я могу перечислить ous (организационные единицы) ниже указанного ou в Active Directory C # - PullRequest
2 голосов
/ 07 октября 2011

Поскольку я не очень опытен в извлечении информации из Active Directory, я надеюсь получить некоторые указатели в правильном направлении.

Я бы хотел перечислить все ous (организационные единицы) ниже указанного ou, но, к сожалению, я не знаю, как заставить все работать.

Допустим, что структура в нашей AD выглядит следующим образом

SomeStartingPoint
|-MySpecifiedOuName
  |-SubOuName1
    |-SubOuName2

То, что у меня пока есть, это

DirectoryEntry rootDSE = new DirectoryEntry( "LDAP://RootDSE" );
string defaultNamingContext = rootDSE.Proeprties[ "defaultNamingContext" ].Value.ToString();
DirectoryEntry entry = new DirectoryEntry( "LDAP://" + defaultNamingContext );
DirectorySearcher ouSearch = 
    new DirectorySearcher( entry.Path ) { Filter = "(objectCategory=organizationalUnit)", SearchScope = SearchScope.Subtree };

ouSearch.PropertiesToLoad.Add( "name" );
ouSearch.PropertiesToLoad.Add( "adspath" );
SearchResultCollection allOUs = ouSearch.FindAll();

Теперь я могу перебрать allOUs и получить доступ к .Properties[ "name" ][ 0 ] и .Properties[ "adspath" ][ 0 ], чтобы вывести список значений для всех OU.

Теперь, когда я пытаюсь использовать другой фильтр, как в Filter = (&(objectCategory=organizationalUnit)(ou=MySpecifiedOuName)), я получаю единственную запись, соответствующую точно MySpecifiedOuName, но не нижележащим подразделениям ниже, даже если они содержат MySpecifiedOuName в своем пути. Вероятно, это связано с тем, что в моем примере я запрашиваю не ту вещь (непосредственно OU), но я не знаю другого способа.

Есть идеи?

Заранее спасибо &

С наилучшими пожеланиями

G.

Ответы [ 3 ]

2 голосов
/ 07 октября 2011

Просто попробуйте этот фильтр:

"(objectCategory=CN=Organizational-Unit,CN=Schema,CN=Configuration,DC=dom,DC=fr)"

Адаптирован к вашему домену с помощью configurationNamingContext из RootDSE для CN=Configuration,DC=dom,DC=fr

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

----- Отредактировано -----

Как настаивает @Desmondфакт "(objectCategory=organizationalUnit)" Я просто проверяю это работает."(objectCategory=CN=Organizational-Unit,CN=Schema,CN=Configuration,DC=dom,DC=fr)" тоже работает.

DirectoryEntry deBase = new DirectoryEntry("LDAP://WM2008R2ENT:389/dc=dom,dc=fr", "jpb", "Pwd");

/* Directory Search
 */
DirectorySearcher dsLookForOUs = new DirectorySearcher(deBase);
dsLookForOUs.Filter = "(objectCategory=organizationalUnit)";
dsLookForOUs.SearchScope = SearchScope.Subtree;
dsLookForOUs.PropertiesToLoad.Add("cn");
dsLookForOUs.PropertiesToLoad.Add("ou");

SearchResultCollection srcOUs = dsLookForOUs.FindAll();

foreach (SearchResult srOU in srcOUs)
{
  Console.WriteLine("{0}", srOU.Path);
}
1 голос
/ 10 октября 2011

Единственный способ сделать то, что вы хотите, - это рекурсивный способ.ou является атрибутом RDN для OU (так же, как CN для пользователей).Таким образом, при поиске ou=foo вы получите только OU с атрибутом OU, установленным в foo.

Чтобы пройтись по цепочке, вам потребуется выполнить поиск по всем OU.на текущем уровне (используйте поиск OneLevel вместо SubTree), а затем выполните поиск там.Это не совсем эффективно, так как вы собираетесь отправлять многочисленные запросы в AD.

Вместо этого вы можете делать то, что делаете, а затем строить свою иерархию, сортируя по DN / глубине.Это более сложно, но это будет более эффективно с точки зрения доступа к ресурсам.

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

Вам больше всего не хватает только опции subtree:

ouSearch.SearchScope = SearchScope.Subtree;
...