我已经搜索了这个主题,但我发现的只是返回不存在某个属性的条目的过滤器,例如:
(!(manager=*))
但是,我想查找存在该属性但具有空值(即空/空白字符串)的条目。我可以使用 LDAP 过滤器来执行此操作吗?如果可以,如何执行?
编辑:
为了确认,上面的过滤器会找到没有该属性的条目,但不会找到属性为空(空字符串)的条目。
这取决于 LDAP 实现还是什么?
从LDAP中,没有查询方法来确定空字符串。
最佳实践是清理 LDAP 的数据输入,因为 LDAP 中的空值或空值根本没有值。
要确定这一点,您需要查询所有具有值 (manager=*) 的值,然后使用代码来确定哪些是“空格”或空值。
正如 Terry 所说,在 DN 语法的属性中存储空值或 null 值是错误的。
某些 LDAP 服务器实现不允许输入 DN 条目不存在的 DN。
也许,如果您的 DN 一致,您可以使用以下内容:
(&(!(manager=cn*))(manager=*))
这应该返回经理的任何值,其中有经理的值并且不以“cn”开头。
但是,某些 LDAP 实现不允许对 DN 语法属性进行子字符串搜索。
-吉姆
使用
\00
搜索空值
例如:
ldapsearch -D cn=admin -w pass -s sub -b ou=users,dc=acme 'manager=\00' uid manager
确保如果在命令行上使用空值,请在其周围使用引号,以防止 OS shell 向 LDAP 发送空字符。例如,这是行不通的:
ldapsearch -D cn=admin -w pass -s sub -b ou=users,dc=acme manager=\00 uid manager
有多个网站引用了此内容以及其他特殊字符。示例:
这篇文章http://technet.microsoft.com/en-us/library/ee198810.aspx引导我找到了解决方案。唯一的变化是感叹号的位置。
(!manager=*)
它似乎按预期工作。
从语义上来说,LDAP 中的这些情况没有区别。
我需要执行一个查询来获取所有具有管理值集(非空)的组,这给出了一些不错的结果:
(!(!managedBy=*))
属性的模式定义决定属性是否必须有值。如果给定示例中的
manager
属性是 RFC4524 中定义的具有 OID 0.9.2342.19200300.100.1.10
的属性,则该属性具有 DN 语法。 DN 语法是一系列相对可分辨名称,并且不能为空。示例中给出的过滤器用于使 LDAP 目录服务器在搜索结果中仅向 LDAP 客户端返回不具有 manager
属性的条目。
您必须否定匹配通配符 *(任何值):
(&(objectCategory=计算机)(创建时>=20160101000000.0Z)(!description=*)) 来自 Microsoft 的 LDAP 查询基础知识:
那个!运算符与通配符运算符结合使用将查找该属性未设置为任何内容的对象。