【发布时间】:2013-01-21 15:10:34
【问题描述】:
我已经搜索过这个主题,但我发现的只是返回某些属性不存在的条目的过滤器,例如:
(!(manager=*))
但是,我想查找存在该属性但具有空值(即空/空白字符串)的条目。我可以使用 LDAP 过滤器执行此操作吗?如果可以,如何操作?
编辑:
只是为了确认一下,上面的过滤器会找到没有属性的条目,但不会找到属性为空(空字符串)的条目。
这取决于 LDAP 实现还是什么?
【问题讨论】:
标签: ldap
我已经搜索过这个主题,但我发现的只是返回某些属性不存在的条目的过滤器,例如:
(!(manager=*))
但是,我想查找存在该属性但具有空值(即空/空白字符串)的条目。我可以使用 LDAP 过滤器执行此操作吗?如果可以,如何操作?
编辑:
只是为了确认一下,上面的过滤器会找到没有属性的条目,但不会找到属性为空(空字符串)的条目。
这取决于 LDAP 实现还是什么?
【问题讨论】:
标签: ldap
从 LDAP 中,没有确定空字符串的查询方法。
最佳做法是将您的数据输入清理到 LDAP,因为 LDAP 中的空值或 null 值根本没有值。
要确定这一点,您需要使用值 (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
确保您是否在命令行上使用空值并在其周围使用引号,以防止操作系统外壳向 LDAP 发送空字符。例如,这不起作用:
ldapsearch -D cn=admin -w pass -s sub -b ou=users,dc=acme manager=\00 uid manager
有很多网站引用了这个以及其他特殊字符。示例:
【讨论】:
ldapsearch 实现的一个意外。
这篇文章http://technet.microsoft.com/en-us/library/ee198810.aspx 引导我找到了解决方案。唯一的变化是感叹号的位置。
(!manager=*)
它似乎按预期工作。
【讨论】:
LDAP 中的这些情况在语义上没有区别。
【讨论】:
我需要进行查询以获取所有具有 managedBy 值集(非空)的组,这给出了一些不错的结果:
(!(!managedBy=*))
【讨论】:
属性的架构定义确定属性是否必须具有值。如果给定示例中的manager 属性是RFC4524 中定义的属性,OID 为0.9.2342.19200300.100.1.10,则该属性具有DN 语法。 DN 语法是一系列相关的可分辨名称,不能为空。示例中给出的过滤器用于使 LDAP 目录服务器在搜索结果中仅将不具有 manager 属性的条目返回给 LDAP 客户端。
【讨论】: