Искать пользователей в AD

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

Попробуйте поискать следующее имя: "имя отчество фамилия". Мой код анализирует это имя следующим образом:

$name = "firstname middlename lastname";
$nameArray = explode(" ", $name);
$fullName = $name;
$firsName = $nameArray[0];
$lastName = $nameArray[count($nameArray)-1];

Этот фильтр отлично работает, если вы ищите только «имя, фамилию» или «имя, отчество, фамилию», но не работает, если вы ищете «отчество»:

(&(!(userAccountControl:1.2.840.113556.1.4.803:=2))(mail=*)(givenname=$firstName*)(sn=$lastName*))

Этот фильтр работает так, как задумано, но очень медленно:

(&(!(userAccountControl:1.2.840.113556.1.4.803:=2))(mail=*)(|(&(givenname=$firstName*)(sn=$lastName*))(displayName=*$fullName*)))

DisplayName, конечно, содержит полное имя, но имеет формат «фамилия, имя, отчество». В идеальном мире у людей было бы 0 или 1 отчество или только одна фамилия, но, конечно, у них может быть и больше.

Есть предложения, как сделать хороший (быстрый) поисковый фильтр?


person user3332631    schedule 26.08.2014    source источник


Ответы (1)


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

Я предлагаю построить поисковый запрос таким образом, чтобы вы начинали с наиболее точной информации, полученной от вашего пользователя, то есть:
Пользователь ввел: Роберт Росс -> ваш запрос должен начинаться с (givenName = $ gn *).

Другими словами, первое условие должно быть наиболее ограничительным, то есть будет меньше объектов, которые будут соответствовать критериям.

Кроме того, вы можете ограничить количество объектов, возвращаемых с сервера, меньшим числом, чем значение по умолчанию (обычно 1000), и запрашивать больше результатов только тогда, когда их потребует пользователь. Кроме того, сортировка довольно дорога для сервера AD, поэтому, если вам действительно нужно сортировать, рассмотрите возможность сортировки с помощью PHP.

Подробные сведения об оптимизации операций поиска AD см. На странице Microsoft MSDN посвящен этой теме.

person Robert Rossmann    schedule 26.08.2014
comment
Отличная информация. Следуя вашей ссылке, я заметил, что проблема моего предпочтительного медленного запроса заключалась в дикой карте в начале (displayName = * $ fullName *). Изменение этого параметра на (anr = $ fullName) помогло. Я также провел еще одну оптимизацию и в итоге получил: (| (& (objectCategory = person) (objectClass = user) (givenname = $ firstName *) (sn = $ lastName *) (mail = *) (! (UserAccountControl: 1.2 .840.113556.1.4.803: = 2))) (& (objectCategory = person) (objectClass = user) (anr = $ fullName) (mail = *) (! (UserAccountControl: 1.2.840.113556.1.4.803: = 2 )))) - person user3332631; 27.08.2014