【问题标题】:How to exclude unique value如何排除唯一值
【发布时间】:2020-04-13 02:35:56
【问题描述】:

LDAP 目录中的对象(用户)具有多值字母数字属性“Profile”。我需要一个搜索过滤器,它返回具有除 P0 以外的任何配置文件的每个用户(无论用户是否具有 P0)。例如:

User1 只有 P0
User2 只有 P1
User3 有 P2 和 P0

搜索应返回 User2 和 User3。这可以通过单独的过滤器(没有脚本)来完成吗?

【问题讨论】:

标签: ldap


【解决方案1】:

根据提供的信息,然后您对问题的回答

"搜索应该返回 User2 和 User3。这可以通过一个 单独过滤(无脚本)?”

没有。

【讨论】:

  • 经过测试,不起作用。 “不相等”部分不包括 P0 的每个人,即使他们有其他个人资料。
【解决方案2】:

没有办法询问对象是否具有“以外”的值,也没有办法询问具有超过 1 个值集的对象。

您也许可以从其他方式接近它:询问具有任何其他配置文件的对象:

(|(profile=P1)(profile=P2))

可能的另一种工作方式是使用>=<= 运算符。但是,这很棘手,因为它们包含相等性 - LDAP 中没有 >< 运算符。这些比较是按字典顺序进行的(字符在 ASCII 图表中出现的顺序)。如果所有这些配置文件名称都以数字结尾,就像您的示例一样,这将容易得多。但否则会非常棘手。

例如,如果您知道所有配置文件都以数字结尾,并且您想查找配置文件不是 P0 的对象,您可以这样做:

(profile>=P00)

按字典顺序,每个数字都在00 之后。这是一个简单的示例,因为P0 将是您可以达到的最低值。但是,如果您想查找除 P5 之外的任何对象,那么您也必须有 <= 条件:

(|(profile<=P49)(profile>=P50))

如果您的个人资料是姓名且并非全部以数字结尾,则它会变得更棘手,但可能仍然可以做到。例如,如果您想查找配置文件不是PurpleProfile 的对象,那么这应该可以:

(|(profile<=purpleprofild~)(profile>=purpleprofile\20))

&lt;= 条件将最后一个字符更改为前一个字符,并添加一个~,这是 ASCII 图表上最后一个可见字符。 &gt;= 条件在末尾添加一个空格(转义),这是 ASCII 图表上的第一个可见字符。

此处的目标是确保您没有排除任何会在您在此处选择的值和您要排除的值之间排序的值。我使用Notepad++ 中的选项按字典顺序排序(突出显示所有内容,然后编辑-> 行操作-> 按字典顺序升序排序行)以使用各种值进行测试。您可能也必须这样做。

唯一的另一种方法是查询具有(profile=*) 设置的任何配置文件的对象,并在您获得结果后进行额外检查并丢弃您不想要的那些。但是,如果您经常这样做,这可能会损害您的应用程序的性能。

【讨论】:

  • Profile 属性中有 10,000 个不同的值,它们每天都在变化。因此,在过滤器中明确列出它们不是一种选择。此查询是允许用户访问的商业现成应用程序的一部分。不幸的是,该应用程序没有调整查询结果的选项。
  • @safesphere 我添加了另一个可能对您有用的选项,但它并不干净。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-23
  • 1970-01-01
  • 2012-10-26
  • 2013-04-10
  • 2011-09-11
  • 1970-01-01
相关资源
最近更新 更多