Активный каталог:Получить информацию о пользователе

StackOverflow https://stackoverflow.com/questions/132277

  •  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:

Пространство имен System.DirectoryServices

Я использовал стандартную библиотеку LDAP для получения информации с сервера Active Directory, но вам нужно будет убедиться, что нужные вам данные доступны через схему сервера LDAP.В общем, вы можете получить любую информацию, хранящуюся в InetOrganizationalPerson, и большую часть информации, относящейся к группам, к которым они принадлежат.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top