Активный каталог:Получить информацию о пользователе
-
02-07-2019 - |
Вопрос
У меня есть веб-приложение, которое работает с проверкой подлинности Windows с использованием нашей Active Directory.У меня появилось новое требование — получить некоторую личную информацию из записи Active Directory.Какой самый простой способ получить доступ к этой информации?
Решение
Доступ к пользователю напрямую через DirectoryEntry кажется наиболее простым подходом.Вот несколько интересных фактов, связанных с AD, которые я узнал из своего первого проекта, связанного с AD:
- В URI напишите LDAP строчными буквами.В противном случае вы получите загадочную ошибку.Я потратил больше суток на эту удручающую тему...
- Чтобы очистить однозначное свойство, установите для него пустую строку, а не нулевое значение.Null вызывает исключение.
- Чтобы очистить многозначное свойство, используйте команду DirectoryEntry.Property.Clear() метод.
- В справочнике схемы Active Directory будет указано, каким типом данных будет значение и является ли оно многозначным или однозначным.
- Вам не нужно вручную выполнять RefreshCache() для элемента Directoryentry, но если вы когда-нибудь будете использовать его и указать, какие свойства кэшировать, знайте, что он не будет автоматически получать какие-либо другие свойства в будущем.
- COMException может быть выброшено абсолютно в любой момент, когда вы используете классы в System.DirectoryServices.Следите за этими блоками попыток.Не думайте, что что-то безопасно.
Вам, вероятно, придется использовать DirectorySearcher, чтобы получить запись каталога вашего пользователя, если вы не знаете его путь (чего вы бы не знали, просто введя его в систему).Использовать его было довольно легко, но остерегайтесь особенностей синтаксиса LDAP;а именно, необходимость кодировать символы, отличные от ASCII (и других?).Строка поиска, которую вы бы использовали, вероятно, будет выглядеть примерно так: (&(sAMAccountName=что угодно)(класс=пользователь)).Это не пришло мне в голову и может быть немного неверным.
А Справочник по схеме Active Directory будет полезно.Поймите, что схема может быть изменена и расширена (например,установка Exchange добавит пользователям информацию о почтовом ящике).
AD-проводник — это полезный инструмент, который можно использовать для отладки и управления данными 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:
Я использовал стандартную библиотеку LDAP для получения информации с сервера Active Directory, но вам нужно будет убедиться, что нужные вам данные доступны через схему сервера LDAP.В общем, вы можете получить любую информацию, хранящуюся в InetOrganizationalPerson, и большую часть информации, относящейся к группам, к которым они принадлежат.