2008-09-25 3 views
10

У меня есть веб-приложение, которое работает под управлением Windows Authentication, используя наш Active Directory. У меня есть новое требование, чтобы вытащить некоторую личную информацию через элемент Active Directory. Каким будет самый простой способ получить доступ к этой информации?Active Directory: Получить информацию о пользователе

ответ

17

Доступ к пользователю непосредственно через DirectoryEntry кажется наиболее простой подход. Вот некоторые из лакомых кусочков AD, которые я узнал из своего первого проекта, связанного с AD:

  • В URI напишите LDAP в нижнем регистре. В противном случае вы получите загадочную ошибку. Я потратил больше одного дня на этот удручающий вопрос ...
  • Чтобы очистить однозначное свойство, установите его в пустую строку, а не в нуль. Null вызывает исключение.
  • Чтобы очистить многозначное свойство, используйте метод DirectoryEntry.Property.Clear().
  • Ссылка на схему Active Directory укажет, какой тип данных будет иметь значение и будет ли он многозначным или однозначным.
  • Вам не нужно вручную обновлятьCache() в каталоге Directory, но если вы когда-либо используете его и указываете, какие свойства кэшировать, знайте, что он не будет автоматически извлекать любые другие свойства в будущем.
  • COMException может быть брошен в абсолютно любое время, когда вы используете классы в System.DirectoryServices. Следите за этими блоками try. Не думайте, что что-то безопасно.

Возможно, вам понадобится использовать DirectorySearcher, чтобы получить запись в каталоге вашего пользователя, если вы не знаете его пути (чего бы вы не хотели, просто зарегистрировавшись в нем). Использование этого было довольно легко, но остерегайтесь причуд в синтаксисе LDAP; а именно, для кодирования символов, отличных от ASCII (и других?). Строка поиска, которую вы использовали бы, вероятно, будет примерно такой: (& (sAMAccountName = whatever) (class = user)). Это от верхней части головы и может быть немного неправильным.

Active Directory schema reference будет полезен. Поймите, что схема может быть изменена и расширена (например, установка Exchange добавит пользователям информацию о почтовых ящиках).

AD Explorer - полезный инструмент, который вы можете использовать для отладки и управления данными AD низкого уровня. Я нашел это полезным, когда я знаю, какое свойство я хочу установить, но не могу найти правильное диалоговое окно в инструменте управления AD.

+0

Только что закончил прокручивать какой-то код, который в основном вы говорили.Использовал DirectorySearcher и получил необходимую мне информацию. К счастью, мне нужно только получить самую основную информацию. – 2008-09-25 09:37:45

+0

для меня, написав ldap в нижнем регистре, выбросил COMException. – 2013-04-24 08:48:02

0

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

5

Возможно, вы найдете следующий фрагмент, полезный как стартер.

public static bool IsUserInGroup(string lanid, string group) 
{ 
    DirectoryEntry entry = new DirectoryEntry("LDAP://" + LDAPPATH); 
    if(entry != null) 
    { 
     [email protected]"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)); 
} 
Смежные вопросы