Active Directory список подразделений - PullRequest
6 голосов
/ 25 мая 2010

У меня есть этот код в настоящее время,

        string defaultNamingContext;

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

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

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

Когда я использую отладчик, я вижу, что rootDSE.Path фактически указывает на правильное место, в данном случае DC=g-t-p,DC=Local, но средство поиска каталогов не находит никаких результатов. Кто-нибудь может помочь?

1 Ответ

8 голосов
/ 25 мая 2010

Стивен - мой плохой - по какой-то причине поиск с использованием objectCategory не работает.

Даже если objectCategory отображается как CN=Organizational-Unit, для поиска вам все равно нужно использовать то же значение, что и для objectClass:

Так что попробуйте использовать фильтр (objectCategory=organizationalUnit) - это определенно работает для меня!

ОБНОВЛЕНИЕ: , чтобы получить некоторые свойства в результатах поиска (чтобы отобразить их в поле со списком), вам необходимо включить их при создании DirectorySearcher:

DirectorySearcher ouSearch = new DirectorySearcher(rootDSE);
ouSearch.Filter = "(objectCategory=Organizational-Unit)";
ouSearch.SearchScope = SearchScope.Subtree;

ouSearch.PropertiesToLoad.Add("name");
// add more properties if you want to ...

При этом вы определенно сможете захватить temp.Properties["name"][0] и вставить его в список предметов в выпадающем списке.

Я действительно не вижу, какая вам нужна строка

DirectoryEntry ou = temp.GetDirectoryEntry();

после захвата имени свойства .....

...