Фильтр LDAP для пустого (пустого) атрибута

Я искал эту тему, но все, что я нашел, это фильтры, возвращающие записи, в которых нет определенного атрибута, например:

(!(manager=*))

Однако я хочу найти записи, в которых присутствует атрибут, но имеет нулевое значение (т.е. пустую/пустую строку). Могу ли я это сделать, используя фильтр LDAP, и если да, то как?

EDIT:

Чтобы подтвердить, указанный выше фильтр находит записи без атрибута, но не там, где атрибут пуст (пустая строка).

Является ли это зависимым от реализации LDAP или что?

Ответы

Ответ 1

Из LDAP не существует метода запроса для определения пустой строки.

Лучшей практикой было бы очистить ваши входы данных до LDAP, поскольку пустое или нулевое значение в LDAP вообще не имеет значения.

Чтобы определить это, вам нужно будет запросить для всех со значением (manager = *), а затем использовать код для определения тех, которые были "пробелом" или нулевым значением.

И, как сказал Терри, неправильное хранение пустого или нулевого значения в атрибуте синтаксиса DN.

Некоторые реализации сервера LDAP не разрешают вводить DN, где запись DN не существует.

Возможно, вы могли бы, если ваше DN согласовано, используйте что-то вроде:

(&(!(manager=cn*))(manager=*))

Это должно возвращать любое значение менеджера, где было значение для менеджера, и оно не начиналось с "cn".

Однако некоторые реализации LDAP не разрешают поиск подстроки по атрибутам синтаксиса DN.

-Джит

Ответ 2

Найдите нулевое значение с помощью \00

Например:

ldapsearch -D cn=admin -w pass -s sub -b ou=users,dc=acme 'manager=\00' uid manager

Убедитесь, что вы используете нулевое значение в командной строке, чтобы использовать кавычки вокруг него, чтобы оболочка ОС не отправляла нулевой символ в LDAP. Например, это не сработает:

 ldapsearch -D cn=admin -w pass -s sub -b ou=users,dc=acme manager=\00 uid manager

Существуют различные сайты, которые ссылаются на это, наряду с другими специальными символами. Пример:

Ответ 3

Эта статья http://technet.microsoft.com/en-us/library/ee198810.aspx привела меня к решению. Единственное изменение - это размещение восклицательного знака.

(!manager=*)

Кажется, работает так, как хотел.

Ответ 4

Семантически нет разницы между этими случаями в LDAP.

Ответ 5

Определение схемы для атрибута определяет, должен ли атрибут иметь значение. Если атрибут manager в приведенном примере - это атрибут, определенный в RFC4524 с OID 0.9.2342.19200300.100.1.10, тогда этот атрибут имеет синтаксис DN. Синтаксис DN - это последовательность относительных отличительных имен, а не должна быть пустой. Фильтр, приведенный в примере, используется для того, чтобы сервер каталогов LDAP возвращал только записи, которые не имеют атрибута manager для клиента LDAP в результатах поиска.

Ответ 6

Мне нужно было сделать запрос, чтобы получить все группы с установленным значением managedBy (не пустым), и это дало хорошие результаты:

(!(!managedBy=*))