Запись каталога LDAP в .Net - не работает с OU = Users - PullRequest
7 голосов
/ 10 сентября 2009

У меня есть следующий код (C #):

(Tweaked от: http://www.eggheadcafe.com/conversation.aspx?messageid=31766061&threadid=31766050)

DirectorySearcher dseSearcher = new DirectorySearcher();

string rootDSE = dseSearcher.SearchRoot.Path;
DirectoryEntry rootDE = new DirectoryEntry(rootDSE);

string userDSE = rootDSE.Insert(7, "OU=Users,");
DirectoryEntry userDE = new DirectoryEntry(userDSE);

rootDSE создан правильно, однако пользователь userDSE не может использоваться и выдает исключение «На сервере такого объекта нет», если я пытаюсь его использовать.

Строки LDAP следующие:

Корень: LDAP: // DC = компания, DC = локальный

Пользователь: LDAP: // OU = Пользователи, DC = компания, DC = локальный

Я работаю в Vista с правами администратора, но это нужно для работы и с XP (Admin).

Я новичок в LDAP и управлении каталогами, поэтому я спотыкаюсь здесь в темноте. Какие-нибудь мысли? Кроме того, любые статьи, на которые можно ссылаться, которые могут дать мне некоторое представление о том, как все это работает, будут оценены.

Ответы [ 3 ]

12 голосов
/ 10 сентября 2009

Первое, что я бы попробовал в качестве теста, - это жестко указать желаемый путь при создании записи каталога следующим образом:

DirectoryEntry de = new DirectoryEntry("LDAP://OU=Users,DC=company,DC=local");

Это довольно быстро скажет вам, является ли это действительным путем в вашей Active Directory. Я не знаю, как выглядит ваша AD, поэтому я не могу сказать вам, является ли это правильный путь или нет. Если в вашем подключаемом модуле Active Directory «Пользователи и компьютеры» указан правильный путь, то у вас должен быть корневой домен и папка OU в корневом каталоге «Пользователи».

Пути генерируются в обратном направлении в AD, поэтому, если ваша папка Users находится под другой OU вне корня, чем это будет

DirectoryEntry de = new DirectoryEntry("LDAP://OU=Users,OU=<first OU folder>,DC=company,DC=local");

Итак, ваша схема AD будет выглядеть так:

 Root 
 |
 --><first OU folder>
     |
     -->Users

Отличная статья о том, как управлять Active Directory в .NET:

Как: сделать (почти) все в Active Directory через C #

Возможно, вы также захотите изучить пространства имен System.DirectoryServices, System.DirectoryServices.ActiveDirectory и System.DirectoryServices.AccountManagement, представленные в .Net 3.5 Framework. Я полагаю, что System.DirectoryServices и пространства имен ActiveDirctory были доступны начиная с .Net 1.1, а AccountManagement был представлен в .Net 3.5.

Документация Microsoft - множество полезных ссылок о том, как использовать пространство имен

Добавление:

Чтобы действительно найти пользователя в AD, вам нужно сделать следующее:

 DirectoryEntry de = new DirectoryEntry();
 de.Path = "LDAP://DC=company,DC=local";
 de.AuthenticationType = AuthenticationTypes.Secure;

 DirectorySearcher deSearch = new DirectorySearcher();

 deSearch.SearchRoot = de;
 deSearch.Filter = "(&(objectClass=user) (cn=" + username + "))";

 SearchResult result = deSearch.FindOne();

 if (result != null)
 {
     DirectoryEntry deUser = new DirectoryEntry(result.Path);
     ... do what ever you need to the deUser
     deUser.Close();
 }
6 голосов
/ 10 сентября 2009

Это может показаться глупым и глупым, но настройка дерева по умолчанию в Active Directory - это не OU = Пользователи , dc = домен, dc = com, а скорее cn = Пользователи , dc = домен, dc = com (Обратите внимание, что CN = не OU = для пользователей.

Это кажется глупым, поскольку контейнерный объект (objectClass of cn) в AD не может быть получателем групповой политики, но по причинам, которые я не понимаю, это значение по умолчанию. (на самом деле я понимаю, это потому, что сдерживание для CN больше похоже на домен NT, чем OU)

Получает почти всех, кого я встречаю, впервые они пытаются привязать / аутентифицировать LDAP к AD.

2 голосов
/ 22 июня 2010

Как правильно упомянул geoffc, в Active Directory «пользователи» в домене - это объект-контейнер, а не объект организационной единицы. Это приводит к совершенно другому пути LDAP, поэтому вы получаете сообщение об ошибке.

Попробуйте следующий код и напишите, если это решит вашу проблему:

// Replace the "company" and "com" with actual domain values...
DirectoryEntry de = new DirectoryEntry("LDAP://CN=Users,DC=company,DC=com");
DirectorySearcher deSearch = new DirectorySearcher();
deSearch.SearchRoot = de;

// Set your other search params here
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...