Ldap active directory python

DjEmber

Во многих локальных сетях используется Microsoft Active Directory.
Используя python с библиотекой ldap3 можно получить информацию для выгрузки в вебпроекты или просто посмотреть нужную информацию (например, когда под пользователем последний раз подключались).

Библиотека python ldap3 — http://ldap3.readthedocs.io
Установка:
pip install ldap3

Использование:
— Ниже привожу код, пример использования. В коде есть поясняющие комментарии.

from ldap3 import Server, Connection, SIMPLE, SYNC, ASYNC, SUBTREE, ALL

# домен — example.com
# DNS имя сервера Active Directory
AD_SERVER = ‘srv.example.com’
# Пользователь (логин) в Active Directory — нужно указать логин в AD
# в формате ‘EXAMPLE\aduser’ или ‘aduser@example.com’
AD_USER = ‘EXAMPLE\aduser’
AD_PASSWORD = ‘FDfashv,.@#’
AD_SEARCH_TREE = ‘dc=example,dc=com’

server = Server(AD_SERVER)
conn = Connection(server,user=AD_USER,password=AD_PASSWORD)
conn.bind()
# в ответ должно быть — True

# Поиск в Active Directory
# примеры ldap фильтров можно посмотреть здесь —
# https://social.technet.microsoft.com/wiki/contents/articles/8077.active-directory-ldap-ru-ru.aspx
# Я в нижеследующем фильтре:
# — исключаю всеx отключенных пользователей (!(UserAccountControl:1.2.840.113556.1.4.803:=2))
# — добавляю только тех пользователей у которых заполнено имя и фамилия
# — и вывожу атрибуты — attributes
# Все возможные атрибуты Active Directory можно посмотреть здесь —
# https://msdn.microsoft.com/en-us/library/ms675090%28v=vs.85%29.aspx
conn.search(AD_SEARCH_TREE,'(&(objectCategory=Person)(!(UserAccountControl:1.2.840.113556.1.4.803:=2))(givenName=*)(sn=*))’,
SUBTREE,
attributes =[‘cn’,’proxyAddresses’,’department’,’sAMAccountName’, ‘displayName’, ‘telephoneNumber’, ‘ipPhone’, ‘streetAddress’,
‘title’,’manager’,’objectGUID’,’company’,’lastLogon’]
)
# после этого запроса в ответ должно быть — True

# можно посмотреть на результат
print(conn.entries)
# или вывести только Common-Name — cn
for entry in conn.entries:
print(entry.cn)

# Найти пользователя с логином admin (sAMAccountName=admin) и показать информацию по нему
conn.search(AD_SEARCH_TREE,'(&(objectCategory=Person)(sAMAccountName=admin))’, SUBTREE,
attributes =[‘cn’,’proxyAddresses’,’department’,’sAMAccountName’, ‘displayName’, ‘telephoneNumber’, ‘ipPhone’, ‘streetAddress’,
‘title’,’manager’,’objectGUID’,’company’,’lastLogon’]
)

Источник

Выгрузка почтовых адресов из Active Directory с помощью Python

Обновлено и опубликовано

Опубликовано: 28.08.2020

Мы рассмотрим простой скрипт для получение всех возможных почтовых адресов по LDAP из Active Directory. Скрипт можно взять за основу и использовать для других реализаций глобального каталога.

Подготовка системы

Рассмотрим процесс подготовки компьютера, на котором будет запускаться скрипт и сервера Active Directory.

Компьютер

В данном примере скрипт будет запускаться на компьютере с Linux. 1. Для начала установим сам Python и дополнительные компоненты: а) На системах RPM (Red Hat, CentOS, Fedora):

* в данном примере мы создали скрипт get_email_from_ad.py с двумя строчками — шебангом и определением кодировки. 4. Даем разрешение скрипту на запуск:

Active Directory

Для подключения к глобальному каталогу по LDAP нам нужна учетная запись для прохождения авторизации на сервере. Нужна учетная запись с минимальными правами. Лучше всего для задач скрипта создать отдельного пользователя. В данной инструкции для связывания с Active Directory будет использоваться учетная запись export_emails. Создать ее можно с помощью инструмента Пользователи и компьютеры Active Directory.

Написание скрипта

1. Подключение по LDAP

try:
lconn = ldap.initialize(‘ldap://dmosk.local:389’)
lconn.protocol_version = ldap.VERSION3
lconn.set_option(ldap.OPT_REFERRALS, 0)
lconn.simple_bind_s(‘export_emails@dmosk.local’, ‘export_emails_12345!’)
except ldap.SERVER_DOWN:
print(«Error connection to AD»)

* в данном примере мы подключаемся к серверу dmosk.local (домен должен разрешаться в любой из серверов глобального каталога) по порту 389. Для прохождения аутентификации мы используем логин export_emails и пароль export_emails_12345! (учетная запись, которая заранее нами была создана в Active Directory). Также мы указываем, что используется 3 версия протокола ldap и не должны использоваться рефералы. Пробуем запустить скрипт:

Он должен вернуть пустую строку. Если мы получим ошибку, то необходимо проверить связь с сервером и корректность введелнных данных (логина и пароля).

2. Получение списка пользователей

base = «DC=dmosk,DC=local»
scope = ldap.SCOPE_SUBTREE
filter = «(&(objectcategory=person))»
attrs = [‘displayname’,’title’]
result_set = []

ldap_result_id = lconn.search_ext(base, scope, filter, attrs)

try:
while 1:
result_type, result_data = lconn.result(ldap_result_id, 0)
if (result_data == []):
break
else:
if result_type == ldap.RES_SEARCH_ENTRY:
result_set.append(result_data)
except ldap.SIZELIMIT_EXCEEDED:
print()

  • base — начальный контейнер, с которого начинаем поиск объектов.
  • scope — область поиска. В нашем примере используется SCOPE_SUBTREE, что означает искать также в дочерних объектах.
  • filter — задаем фильтр. В текущем примере ищем объекты person (пользователи).
  • attrs — атрибуты объектов, которые нас интересуют.
  • result_set — массив данных с полученным результатом.
  • ldap_result_id — идентификатор поиска объектов в каталоге.

Мы должны получить массив данных всех найденных пользователей и их атрибутов.

3. Получение почтовых атрибутов

На этом этапе мы отсеем все объекты, у которых нет адреса электронной почты. В итоге, наш массив данных будет содержать пользователей и атрибуты с адресами электронной почты.

Откроем наш скрипт и заменим строки:

.
filter = «(&(objectcategory=person))»
attrs = [‘displayname’,’title’]
.

filter = «(&(mail=*))»
attrs = [‘mail’,’proxyAddresses’]

* в данном примере мы выгрузим все объекты, у которых есть адрес почты (не пустой атрибут mail). Нас будут интересовать 2 атрибута — собственно, mail и proxyAddresses, в котором могут быть перечислены все возможные адреса объекта.
* данный фильтр позволит получить список не только пользователей, но и групп. Возможно, вам это не нужно. Тогда можно изменить наш фильтр, например на «(&(objectcategory=person)(mail=*))» — тогда мы получим только пользователей, у которых есть электронные адреса.

Мы должны получить список объектов с адресами электронной почты.

4. Получение списка адресов электронной почты

На конец, вытащим почтовые адреса и составим общий список.

В нашем скрипте удаляем строку:

all_emails = []
for user in result_set:
proxyAddresses = user[0][1].get(‘proxyAddresses’)
mail = user[0][1].get(‘mail’)
if (proxyAddresses):
for email_b in proxyAddresses:
email = email_b.decode(«utf-8»)
all_emails.append(email.split(‘:’)[1])
else:
all_emails.append(mail[0].decode(«utf-8»))

unique_all_emails = list(set(all_emails))
print(*unique_all_emails, sep = ‘\n’)

* и так, данными действиями мы перебираем полученный массив пользователей и извлекаем все email-адреса. Если у пользователя не пустой атрибут proxyAddresses, значит берем адреса из него, если у пользователя есть только mail, то берем его. В итоге, все данные помещаем в массив all_emails, который в конце преобразовываем для получения уникальных значений (в каталоге могут хранится одинаковые email для разных объектов).

Мы должны получить список уникальных email-адресов для всех объектов, которые были найдены в глобальном каталоге.

Пример готового скрипта

Написанный нами скрипт можно представить так:

  1. #!/usr/bin/env python3
  2. # -*- encoding: utf-8 -*-
  3. # Импортируем python-модули
  4. import ldap
  5. # Задаем необходимые переменные
  6. domain = ‘dmosk.local’
  7. base = ‘DC=dmosk,DC=local’
  8. bind_dn = f’export_emails@’
  9. bind_dn_password = ‘export_emails_12345!’
  10. scope = ldap.SCOPE_SUBTREE
  11. filter = «(&(mail=*))»
  12. attrs = [‘mail’,’proxyAddresses’]
  13. result_set = []
  14. all_emails = []
  15. # Подключаемся к глобальному каталогу по LDAP
  16. try:
  17. lconn = ldap.initialize(f’ldap://:389′)
  18. lconn.protocol_version = ldap.VERSION3
  19. lconn.set_option(ldap.OPT_REFERRALS, 0)
  20. lconn.simple_bind_s(bind_dn, bind_dn_password)
  21. except ldap.SERVER_DOWN:
  22. print(«Error connection to AD»)
  23. # Получаем результаты поиска объектов в AD
  24. ldap_result_id = lconn.search_ext(base, scope, filter, attrs)
  25. Все результаты поиска объектов заносим в переменную result_set
  26. try:
  27. while 1:
  28. result_type, result_data = lconn.result(ldap_result_id, 0)
  29. if (result_data == []):
  30. break
  31. else:
  32. if result_type == ldap.RES_SEARCH_ENTRY:
  33. result_set.append(result_data)
  34. except ldap.SIZELIMIT_EXCEEDED:
  35. print()
  36. # Получаем список email-адресов и заносим его в переменную all_emails
  37. for user in result_set:
  38. proxyAddresses = user[0][1].get(‘proxyAddresses’)
  39. mail = user[0][1].get(‘mail’)
  40. if (proxyAddresses):
  41. for email_b in proxyAddresses:
  42. email = email_b.decode(«utf-8»)
  43. all_emails.append(email.split(‘:’)[1])
  44. else:
  45. all_emails.append(mail[0].decode(«utf-8»))
  46. # Получаем уникальные значения электронных адресов и заносим их в переменную unique_all_emails
  47. unique_all_emails = list(set(all_emails))
  48. # Выводим результат на экран
  49. print(*unique_all_emails, sep = ‘\n’)

Источник

Читайте также:  Вставка аудио для html
Оцените статью