Получение AD списка OU

Я надеюсь смочь вытянуть список текущего OU's от Active Directory, для которого я смотрел на некоторый пример кода онлайн когда-то, но O, кажется, не могут заставить это работать.

        string defaultNamingContext;

        DirectoryEntry rootDSE = new DirectoryEntry("LDAP://RootDSE");
        defaultNamingContext = rootDSE.Properties["defaultNamingContext"].Value.ToString();
        DirectorySearcher ouSearch = new DirectorySearcher(rootDSE, "(objectClass=organizationalUnit)", 
            null, SearchScope.Subtree);

        MessageBox.Show(rootDSE.ToString());
        try
        {
            SearchResultCollection collectedResult = ouSearch.FindAll();
            foreach (SearchResult temp in collectedResult)
            {
                comboBox1.Items.Add(temp.Properties["name"][0]);
                DirectoryEntry ou = temp.GetDirectoryEntry();
            }

Ошибка, которую я получаю, является Там поставщиком, не поддерживает поиск и не может искать LDAP://RootDSE Никакие Идеи? для каждого из тех возвращенных результатов поиска я хочу добавить их к полю комбинированного списка. (не должно быть слишком твердым),

5
задан marc_s 25 May 2010 в 10:31
поделиться

1 ответ

Вы не можете искать на уровне LDAP://RootDSE - это просто "информационный" адрес с некоторыми материалами. На самом деле он не представляет никакого местоположения в вашем каталоге. Сначала вам нужно привязаться к контексту именования по умолчанию:

string defaultNamingContext;

DirectoryEntry rootDSE = new DirectoryEntry("LDAP://RootDSE");
defaultNamingContext = rootDSE.Properties["defaultNamingContext"].Value.ToString();

DirectoryEntry default = new DirectoryEntry("LDAP://" + defaultNamingContext);

DirectorySearcher ouSearch = new DirectorySearcher(default, 
                                     "(objectClass=organizationalUnit)", 
                                     null, SearchScope.Subtree);

Как только вы это сделаете, вы должны быть в порядке, чтобы найти все OU в вашем домене.

И чтобы ускорить поиск, я бы рекомендовал не использовать objectClass - это свойство не индексируется в AD. Вместо этого используйте objectCategory, которое индексируется:

DirectorySearcher ouSearch = new DirectorySearcher(default, 
                                     "(objectCategory=Organizational-Unit)", 
                                     null, SearchScope.Subtree);

UPDATE:
Я обнаружил, что этот фильтр неверен - несмотря на то, что objectCategory отображается как CN=Organizational-Unit,...... в ADSI браузере, вам нужно указать objectCategory=organizationalUnit в поиске, чтобы он был успешным:

DirectorySearcher ouSearch = new DirectorySearcher(default, 
                                     "(objectCategory=organizationalUnit)", 
                                     null, SearchScope.Subtree);
10
ответ дан 13 December 2019 в 22:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: