У меня есть веб-приложение, которое работает с проверкой подлинности Windows с использованием нашей Active Directory. У меня появилось новое требование извлекать некоторую личную информацию из записи Active Directory. Как проще всего получить доступ к этой информации?
Active Directory: получение информации о пользователе
Ответы:
Доступ к пользователю напрямую через DirectoryEntry кажется наиболее простым подходом. Вот несколько интересных моментов, связанных с AD, которые я узнал из своего первого проекта, связанного с AD:
- В URI напишите LDAP в нижнем регистре. В противном случае вы получите загадочную ошибку. Я потратил больше суток на эту удручающую тему ...
- Чтобы очистить однозначное свойство, установите для него пустую строку, а не null. Null вызывает исключение.
- Чтобы очистить свойство с несколькими значениями, используйте метод DirectoryEntry.Property.Clear ().
- В справочнике схемы Active Directory будет указано, к какому типу данных будет относиться значение и будет ли оно многозначным или однозначным.
- Вам не нужно вручную запускать RefreshCache () для Directoryentry, но если вы когда-либо будете использовать его и укажете, какие свойства кэшировать, знайте, что он не будет автоматически извлекать какие-либо другие свойства в будущем.
- Исключение COMException может быть сгенерировано в любой момент, когда вы используете классы в System.DirectoryServices. Следите за этими пробными блоками. Не думайте, что что-то безопасно.
Вам, вероятно, потребуется использовать DirectorySearcher, чтобы получить запись в каталоге пользователя, если вы не знаете ее путь (чего бы вы не знали, просто если он вошел в систему). Использовать его было довольно просто, но остерегайтесь причуд в синтаксисе LDAP; а именно необходимость кодирования не-ASCII (и других?) символов. Строка поиска, которую вы могли бы использовать, вероятно, будет примерно такой: (& (sAMAccountName = something) (class = user)). Это не в моей голове и может быть немного неверно.
Будет полезен справочник по схеме Active Directory. Помните, что схема может быть изменена и расширена (например, установка Exchange добавит пользователям информацию о почтовых ящиках).
AD Explorer - это полезный инструмент, который можно использовать для отладки и слабого уровень управления данными AD. Я считаю полезным, когда я знаю, какое свойство хочу установить, но не могу найти нужное диалоговое окно в средстве управления AD.
Вам может быть полезен следующий фрагмент для начала.
public static bool IsUserInGroup(string lanid, string group)
{
DirectoryEntry entry = new DirectoryEntry("LDAP://" + LDAPPATH);
if(entry != null)
{
entry.Username=@"LDAPUSER";
entry.Password="LDAPPASSWORD";
DirectorySearcher srch = new DirectorySearcher(entry);
srch.Filter = String.Format("(&(objectClass=person)(sAMAccountName={0}))", lanid);
srch.PropertiesToLoad.Add("memberOf");
SearchResult result = srch.FindOne();
if(result != null)
{
if(result.Properties.Contains("memberOf"))
{
string lookfor = String.Format("cn={0},", group.ToLower());
foreach(string memberOf in result.Properties["memberOf"])
{
if(memberOf.ToLower().StartsWith(lookfor))
return true;
}
}
}
return false;
}
throw new Exception(String.Format("Could not get Directory lanid:{0}, group{1}", lanid, group));
}
Очень хорошая ссылка: Как: (почти) все в Active Directory через C #
Взгляните на пространство имен System.DirectoryServices:
Пространство имен System.DirectoryServices
Я использовал стандартную библиотеку LDAP для получения информации с сервера Active Directory, но вам нужно будет убедиться, что нужные вам данные доступны через схему сервера LDAP. В общем, вы можете получить любую информацию, хранящуюся в InetOrganizationalPerson, и большую часть информации, относящейся к группам, к которым они принадлежат.