33

我已经搜索过这个主题,但我发现的只是过滤器,它们返回不存在某个属性的条目,例如:

(!(manager=*))

但是,我想查找存在属性但具有空值(即空/空白字符串)的条目。我可以使用 LDAP 过滤器执行此操作吗?如果可以,如何操作?

编辑:

只是为了确认一下,上面的过滤器会找到没有属性的条目,但不会找到属性为空的条目(空字符串)。

这取决于 LDAP 实现还是什么?

4

6 回答 6

23

在 LDAP 中,没有用于确定空字符串的查询方法。

最佳实践是清理您对 LDAP 的数据输入,因为 LDAP 中的空值或 null 值根本没有值。

要确定这一点,您需要使用值 (manager=*) 查询所有内容,然后使用代码确定“空格”或空值。

正如特里所说,在 DN 语法的属性中存储空值或空值是错误的。

某些 LDAP 服务器实现不允许输入不存在 DN 条目的 DN。

也许,如果您的 DN 一致,您可以使用以下内容:

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

这应该返回经理的任何值,其中经理有一个值并且它不是以“cn”开头的。

但是,某些 LDAP 实现不允许对 DN 语法属性进行子字符串搜索。

-吉姆

于 2013-01-22T11:39:56.443 回答
9

使用搜索空值\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

有很多网站引用了这个,以及其他特殊字符。例子:

于 2013-06-20T19:09:56.493 回答
9

这篇文章http://technet.microsoft.com/en-us/library/ee198810.aspx引导我找到了解决方案。唯一的变化是感叹号的位置。

(!manager=*)

它似乎按预期工作。

于 2014-12-12T13:29:03.730 回答
3

从语义上讲,LDAP 中的这些情况之间没有区别。

于 2013-01-21T22:41:09.763 回答
3

我需要进行查询以获取所有具有 managedBy 值集(非空)的组,这给出了一些不错的结果:

(!(!managedBy=*))
于 2013-12-12T17:00:52.317 回答
2

属性的模式定义确定属性是否必须具有值。如果manager给定示例中的属性是在RFC4524中使用 OID定义的属性0.9.2342.19200300.100.1.10,则该属性具有 DN 语法。DN 语法是相对专有名称的序列,不能为空。示例中给出的过滤器用于使 LDAP 目录服务器在搜索结果中仅返回不具有managerLDAP 客户端属性的条目。

于 2013-01-22T11:24:18.823 回答