搜索筛选器语法
搜索筛选器使你能够定义搜索条件,并提供更有效的搜索。
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>)
或
<filter>=(<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时,范围没有限制,可以是 base
、one-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 的字符串。 令牌 <value> 是一个字符串,表示由基础目录服务定义其格式的 AttributeValue。
如果 <value> 必须包含星号 (*)、左括号 (() 或右括号 ()) 字符,则应在该字符前加上反斜杠 (\) 转义符。
特殊字符
如果以下特殊字符必须作为文字出现在搜索筛选器中,则必须用列出的转义序列替换。
ASCII 字符 | 转义序列替换 |
---|---|
* | \2a |
( | \28 |
) | \29 |
\ | \5c |
NUL | \00 |
/ | \2f |
注意
在使用 MultiByte 字符集的情况下,如果使用 SQL 方言通过 ADO 进行搜索,则必须使用上述转义序列。
此外,还可以使用转义序列语法来表示任意二进制数据,即用反斜线 (\) 对二进制数据的每个字节进行编码,然后跟上两个十六进制数字。 例如,四字节值 0x00000004 在筛选器字符串中编码为 \00\00\00\04。
相关主题