Ваш запрос почти прав, но он работает окольным путем:)
Нет objectCategory
с именем persons
. Это просто person
(без «с»). Так что objectCategory=persons
всегда ложно для каждого объекта в вашем домене. Но это работает, потому что вы используете ИЛИ (|
).
Так что единственный критерий, который он действительно использует, это sAMAccountName=*$current_user*
. Но это требует любого объекта, в котором sAMAccountName
содержит $current_user
. Это имеет два непреднамеренных последствия:
- Если у вас есть пользователь с именем
neil
, а другой - с именем oneil
, то всякий раз, когда neil
входит в систему, вы найдете обе учетные записи в этом поиске. - Поскольку критерии поиска начинаются с подстановочного знака (
*
), он не может использовать индекс для поиска учетной записи. Это означает, что он должен просматривать каждый объект в вашем домене, чтобы найти совпадение. Это может не иметь значения, если у вас небольшой домен, но чем больше объектов у вас в домене, тем дольше это займет.
IIS дает вам точное имя пользователя, поэтому нет необходимостисделать «содержит» сравнение. Таким образом, ваш запрос может быть упрощен до:
(sAMAccountName=$current_user)
Поскольку sAMAccountName
является индексированным атрибутом, это будет очень быстрый запрос.
Вы часто будете видеть добавленные критерии ограниченияпоиск по учетным записям пользователей, например так (обратите внимание на &
):
(&(objectClass=user)(objectCategory=person)(sAMAccountName=$current_user))
Но на самом деле, только пользователи могут проходить аутентификацию в IIS, и sAMAccountName
уникален для всех типов объектов, поэтому он неt действительно имеет значение.