搜索筛选器语法

使用搜索筛选器可以定义搜索条件,并提供更高效且有效的搜索。

ADSI 支持 RFC2254 中定义的 LDAP 搜索筛选器。 这些搜索筛选器由 Unicode 字符串表示。 下表列出了 LDAP 搜索筛选器的一些示例。

搜索筛选器 说明
“ (objectClass=*) ” 所有对象。
“ ( (& objectCategory=person) (objectClass=user) (! (cn=andy) ) ) ” 所有用户对象,但“andy”。
“ (sn=sm*) ” 以“sm”开头的姓氏的所有对象。
“ ( (& objectCategory=person) (objectClass=contact) (| (sn=Smith) (sn=Johnson) ) ) ” 所有姓氏等于“Smith”或“Johnson”的联系人。

 

这些搜索筛选器使用以下格式之一。

<filter>=(<attribute><operator><value>)

or

(<operator><filter1><filter2>)

ADSI 搜索筛选器采用两种方式。 它们构成了 LDAP 方言的一部分,用于通过 OLE DB 提供程序提交查询。 它们还与 IDirectorySearch 接口一起使用。

运算符

下表列出了常用搜索筛选器运算符。

逻辑运算符 说明
= 等于
~= 大致等于
<= 字典小于或等于
>= 字典上大于或等于
& AND
| OR
! NOT

 

除了上述运算符,LDAP 还定义了两个匹配的规则对象标识符 (OID) ,可用于对数值执行按位比较。 匹配规则具有以下语法。

<attribute name>:<matching rule OID>:=<value>

“<attribute name>”是属性的 lDAPDisplayName ,“<rule OID”是匹配规则的 OID>,“<value>”是用于比较的值。 请注意,不能在此字符串中使用空格。 “<value>”必须是十进制数;不能是十六进制数或常量名称,例如 ADS_GROUP_TYPE_SECURITY_ENABLED。 有关可用 Active Directory 属性的详细信息,请参阅 “所有属性”。

下表列出了 LDAP 实现的匹配规则 OID。

匹配规则 OID 来自 Ntldap.h) 的字符串标识符 ( 说明
1.2.840.113556.1.4.803 LDAP_MATCHING_RULE_BIT_AND 仅当属性中的所有位与值匹配时,才会找到匹配项。 此规则等效于按位 AND 运算符。
1.2.840.113556.1.4.804 LDAP_MATCHING_RULE_BIT_OR 如果属性中的任何位与值匹配,则找到匹配项。 此规则等效于按位 OR 运算符。
1.2.840.113556.1.4.1941 LDAP_MATCHING_RULE_IN_CHAIN 此规则仅限于应用于 DN 的筛选器。 这是一个特殊的“扩展”匹配运算符,它一直将对象中的祖先链一直引导到根目录,直到找到匹配项。

 

以下示例查询字符串搜索设置了 ADS_GROUP_TYPE_SECURITY_ENABLED 标志的组对象。 请注意, ADS_GROUP_TYPE_SECURITY_ENABLED (0x80000000 = 2147483648) 的小数值用于比较值。

(&(objectCategory=group)(groupType:1.2.840.113556.1.4.803:=2147483648))

LDAP_MATCHING_RULE_IN_CHAIN是一个匹配的规则 OID,旨在提供一种方法来查找对象的祖先。 许多使用 AD 和 AD LDS 的应用程序通常使用分层数据,按父子关系排序。 以前,应用程序执行了可传递组扩展,以找出使用过多网络带宽的组成员身份:如果链接遍历到末尾,则应用程序需要进行多次往返,以找出某个对象是否“链中”掉落。

此类查询的一个示例旨在检查用户“user1”是否是组“group1”的成员。 将基数设置为用户 DN (cn=user1, cn=users, dc=x) 和范围, base并使用以下查询。

(memberof:1.2.840.113556.1.4.1941:=cn=Group1,OU=groupsOU,DC=x)

同样,若要查找“user1”是其成员的所有组,请将基设置为组容器 DN;例如 (OU=groupsOU, dc=x) ,以及其 subtree范围,并使用以下筛选器。

(member:1.2.840.113556.1.4.1941:=cn=user1,cn=users,DC=x)

请注意,使用 LDAP_MATCHING_RULE_IN_CHAIN时,范围不受限制,可以是 baseone-level也可以 subtree。 子树上的某些此类查询可能更密集,例如通过高扇出追逐链接:也就是说,列出用户所属的所有组。 低效的搜索将记录适当的事件日志消息,就像使用任何其他类型的查询一样。

通配符

还可以将通配符和条件添加到 LDAP 搜索筛选器。 以下示例演示可用于搜索目录的子字符串。

获取所有条目:

(objectClass=*)

获取公共名称中某个位置包含“bob”的条目:

(cn=*bob*)

获取公用名大于或等于“bob”的条目:

(cn>='bob')

获取具有电子邮件属性的所有用户:

(&(objectClass=user)(email=*))

获取具有电子邮件属性和姓氏等于“smith”的所有用户条目:

(&(sn=smith)(objectClass=user)(email=*))

获取以“andy”、“steve”或“margaret”开头的公用名称的所有用户条目:

(&(objectClass=user)(| (cn=andy*)(cn=steve*)(cn=margaret*)))

获取没有电子邮件属性的所有条目:

(!(email=*))

搜索筛选器的正式定义如下 (RFC 2254) :

<filter> ::= '(' <filtercomp> ')'
<filtercomp> ::= <and> | <or> | <not> | <item>
<and> ::= '&' <filterlist>
<or> ::= '|' <filterlist>
<not> ::= '!' <filter>
<filterlist> ::= <filter> | <filter> <filterlist>
<item>::= <simple> | <present> | <substring>
<simple> ::= <attr> <filtertype> <value><filtertype> ::= <equal> | <approx> | <ge> | <le>
<equal> ::= '='
<approx> ::= '~='
<ge> ::= '>='
<le> ::= '<='
<present> ::= <attr> '=*'
<substring> ::= <attr> '=' <initial> <any> <final>
<initial> ::= NULL | <value><any> ::= '*' <starval>
<starval> ::= NULL | <value>'*' <starval>
<final> ::= NULL | <value>

标记 <attr> 是表示 AttributeType 的字符串。 标记 <值> 是一个字符串,表示由基础目录服务定义其格式的 AttributeValue。

如果值<>必须包含星号 (*) 、左括号 ( () 或右括号 () ) 字符,则字符应以反斜杠转义字符 (\) 开头。

特殊字符

如果以下任何特殊字符必须作为文本出现在搜索筛选器中,则必须将其替换为列出的转义序列。

ASCII 字符 转义序列替换
* \2a
( \28
) \29
\ \5c
NUL \00
/ \2f

 

注意

如果使用 MultiByte 字符集,则必须使用上面列出的转义序列(如果 ADO 使用SQL方言执行搜索)。

 

此外,可以使用转义序列语法来表示任意二进制数据,方法是使用反斜杠 (\) 后跟两个十六进制数字对二进制数据的每个字节进行编码。 例如,筛选器字符串中的四字节值0x00000004编码为 \00\00\00\00\04。

LDAP 方言

SQL方言

使用 IDirectorySearch 接口进行搜索

使用 ActiveX 数据对象进行搜索

使用 OLE DB 进行搜索