Регулярное выражение для работы со списком OU, DN и CN в выдаче поиска ldap

А вам есть чем поделиться?
Ответить
Аватара пользователя

Автор темы
DesignerMix
Администратор
Администратор
Сообщения: 5163
Зарегистрирован: 25 апр 2014, 10:51
Есть ответ: 189
Репутация: 600
Откуда: Белгород
Контактная информация:
Статус: Не в сети

Регулярное выражение для работы со списком OU, DN и CN в выдаче поиска ldap

Сообщение DesignerMix » 19 июл 2017, 09:38

Так как я бился над этим вопросом довольно долго то хотелось-бы здесь описать порядок действий и вообще чего я хотел добиться, может кому пригодится:

Итак, я написал небольшую программку на PHP которая выводит информацию только для тех, кто авторизирован (вошел в систему). Вход в систему осуществляется с доменными учетными записями. Код ниже ищет имя пользователя (посредством ldap) только в не заблокированных учетках которые не являются учетками компьютеров в OU=TEST2,DC=TEST1,DC=TEST0 (это база PHP-функции ldap_search см. код ниже):
(&(objectCategory=person)(objectClass=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2))(!(objectClass=Computer))(sAMAccountName=Здесь_имя_введенное_пользователем_в_форму))

Если пользователь найден по этому фильтру то его "пускает" в мою программку выдавая сессию в которой хранится имя пользователя. Но параллельно с выдачей сессии я захотел вносить в БД данные о пользователе "вытащенные" из AD, а именно: фамилию, имя, телефон (если указан), почту (если указана) и имя последнего OU в котором он находится.

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

Теперь когда известно что мне нужно приступаю к извлечению данных:

Код: Выделить всё

$adServer = "ldap://192.168.255.255";
$domain = "@test1.test0";
$ldap = ldap_connect($adServer);
$username = $_REQUEST['username'];
$password = $_REQUEST['password'];
ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ldap, LDAP_OPT_REFERRALS, 0);
$bind = @ldap_bind($ldap, $username.$domain, $password);
if ($bind) {
$filter="(sAMAccountName=$username)";
$result = ldap_search($ldap,"OU=TEST2,DC=TEST1,DC=TEST0",$filter);
ldap_sort($ldap,$result,"sn");
$info = ldap_get_entries($ldap, $result);
preg_match('/(?<=OU=)([[:word:]\s]+)/u',$info[0]["distinguishedname"][0],$match);
echo @$info[0]['sn'][0]." ".@$info[0]['givenname'][0]." ".@$info[0]['telephonenumber'][0]." ".@$info[0]['mail'][0]." ".$match[0];
Если там были данные переменные (вернее массивы) возвращают:
@$info[0]['sn'][0] - фамилию;
@$info[0]['givenname'][0] - имя;
@$info[0]['telephonenumber'][0] - номер телефона;
@$info[0]['mail'][0] - почту;

А вот массив $match[0] возвращает только имя последнего OU в котором находится пользователь. Поясню:
в массиве $info[0]["distinguishedname"][0] находится строка вида CN=Otdel_100,OU=БЛАБЛА_БЛА-123!,OU=БЛАБЛА БЛА 123,DC=TEST1,DC=TEST0, меня интересует ТОЛЬКО текст БЛАБЛА_БЛА-123!. Чтобы его достать я передаю этот массив в качестве строки в функцию preg_match и в качестве регулярного выражения указываю /(?<=OU=)([[:word:]-()?!\s]+)/u а первый элемент соответствующий данному регулярному выражению помещается в массив $match[0].

Разберем выражение /(?<=OU=)([[:word:]-()?!\s]+)/u

Между / и /u могут быть любые unicode-символы (UTF-16), а т.к. у меня есть русский текст это важно;
(?<=OU=) выражение, если оно соответствует паттерну OU= (чувствительно к регистру), то после него выполняется поиск на соответствие выражению ([[:word:]-()?!\s]+) которое в свою очередь проверяет что идет подряд несколько слов и/или цифр а также символов _-()?! до запятой (т.к. она не указана). Т.е. если брать пример со строкой CN=Otdel_100,OU=БЛАБЛА_БЛА-123!,OU=БЛАБЛАБЛА 123,DC=TEST1,DC=TEST0 после выполнения регулярного выражения я получу только БЛАБЛА_БЛА-123! и БЛАБЛА БЛА 123.

В составлении этого регулярного выражение очень помог сайт https://regex101.com/ :super:

Теги:

Ответить

Вернуться в «Хобби и увлечения»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость