Как правильно получить определенные пользовательские атрибуты из Active Directory через LDAP C API?

Я пытаюсь получить некоторые пользовательские атрибуты из Active Directry, используя Windows LDAP API. Я использую:

  • Версия Active Directory: та, которая поставляется с Windows Server 2012.
  • Версия LDAP: 3
  • Версия Wldap32.lib: та, которая поставляется с Windows 10 x64.

Eg:

PCHAR myAttributes[4];

myAttributes[0] = "DistinguishedName";
myAttributes[1] = "DisplayName";
myAttributes[2] = "PasswordExpired";
myAttributes[3] = "mail";

ldap_search_s(
    myLdapConnection,   // Ldap connection
    myDomain,           // DN to start search
    LDAP_SCOPE_SUBTREE, // Scope
    myFilter,           // Filter
    myAttributes,       // Retrieve list of attributes
    0,                  // Get both attributes and values
    &mySearchResult     // [out] Search results
); 

Он возвращает атрибуты DistinguishedName, DisplayName и mail, но не возвращает атрибут PasswordExpired.

Я запросил некоторые другие атрибуты, и похоже, что он не возвращает атрибуты с логическими значениями, а также атрибут EmailAddress.

  1. Почему он не возвращает атрибут PasswordExpired?
  2. А как насчет EmailAddress ?
  3. Есть ли разница между EmailAddress и mail ?

person MiJo    schedule 21.05.2016    source источник


Ответы (1)


  1. В Active Directory отсутствует атрибут PasswordExpired LDAP. Чтобы построить запрос, просмотрите этот URL-адрес для имен атрибутов в стандартной схеме Active Directory https://msdn.microsoft.com/en-us/library/ms675090(v=vs.85).aspx. Чтобы проверить, истек ли срок действия пароля для данной учетной записи, вам необходимо проверить атрибут userAccountControl, который на самом деле является значением, хранящим флаги различных состояний учетной записи пользователя https://msdn.microsoft.com/en-us/library./ms680832(v=vs.85).aspx. Существует интерфейс IADsUser, который переведет все это для вас, если вам не нужно придерживаться только LDAP https://msdn.microsoft.com/en-us/library/aa746343(v=vs.85).aspx

  2. Вы найдете текущий основной адрес электронной почты в атрибуте почты. Атрибута LDAP EmailAddress нет, если только вы не имели в виду адреса электронной почты, которые являются CN для того же атрибута схемы, что и почта, поэтому нет никакой разницы.

  3. См. выше. В общем, если у вас нет веских причин придерживаться только C/LDAP, я бы порекомендовал вам вместо этого использовать .Net Framework. В противном случае у вас впереди много работы — не только интерпретация битовых флагов, как в случае истечения срока действия пароля, но, возможно, также с различными методами аутентификации, различными структурами, фиксирующими время и дату, учет часовых поясов, UTF, поиск рефералов и другие вещи, которые вы могли бы нужно в зависимости от сложности того, чего вы хотите достичь. Вы будете работать гораздо быстрее в .Net Framework. См. Службы каталогов https://msdn.microsoft.com/en-us/library/mt481534(v=vs.110).aspx или пространство имен безопасности https://msdn.microsoft.com/en-us/library/mt481561(v=vs.110).aspx для получения подробной информации.

person Martin Lhotsky    schedule 23.05.2016