검색 필터 구문
검색 필터를 사용하면 검색 조건을 정의하고 보다 효율적이고 효과적인 검색을 제공할 수 있습니다.
ADSI는 RFC2254 정의된 LDAP 검색 필터를 지원합니다. 이러한 검색 필터는 유니코드 문자열로 표시됩니다. 다음 표에서는 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 검색 필터는 두 가지 방법으로 사용됩니다. OLE DB 공급자를 통해 쿼리를 제출하기 위한 LDAP 방언의 일부를 구성합니다. 또한 IDirectorySearch 인터페이스와 함께 사용됩니다.
연산자
다음 표에서는 자주 사용되는 검색 필터 연산자를 나열합니다.
논리 연산자 | 설명 |
---|---|
= | 같음 |
~= | 대략 같음 |
<= | 사전적으로 보다 작거나 같음 |
>= | 사전적으로 보다 크거나 같음 |
& | AND |
| | 또는 |
! | NOT |
위의 연산자 외에도 LDAP는 숫자 값의 비트 비교를 수행하는 데 사용할 수 있는 두 개의 일치하는 OID(규칙 개체 식별자)를 정의합니다. 일치 규칙에는 다음 구문이 있습니다.
<attribute name>:<matching rule OID>:=<value>
"<특성 이름>"은 특성의 lDAPDisplayName 이고, "<규칙 OID"는 일치 규칙의 OID>이고, "<value>"는 비교에 사용할 값입니다. 이 문자열에는 공백을 사용할 수 없습니다. "<value>"는 10진수여야 하며 16진수 또는 상수 이름(예: 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 10진수 값 (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을 나타내는 문자열입니다. 토큰 <값> 은 기본 디렉터리 서비스에서 형식을 정의하는 AttributeValue를 나타내는 문자열입니다.
값>에 <별표(*), 왼쪽 괄호(() 또는 오른쪽 괄호())가 포함되어야 하는 경우 문자 앞에 백슬래시 이스케이프 문자(\)가 와야 합니다.
특수 문자
검색 필터에 다음 특수 문자가 리터럴로 표시되어야 하는 경우 나열된 이스케이프 시퀀스로 바꿔야 합니다.
ASCII 문자 | 이스케이프 시퀀스 대체 |
---|---|
* | \2a |
( | \28 |
) | \29 |
\ | \5c |
NUL | \00 |
/ | \2f |
참고 항목
MultiByte 문자 집합을 사용하는 경우 SQL 방언을 사용하여 ADO에서 검색을 수행하는 경우 위에 나열된 이스케이프 시퀀스를 사용해야 합니다.
또한 임의의 이진 데이터는 백슬래시(\) 뒤에 두 개의 16진수 숫자로 이진 데이터의 각 바이트를 인코딩하여 이스케이프 시퀀스 구문을 사용하여 나타낼 수 있습니다. 예를 들어 0x00000004 4 바이트 값은 필터 문자열에서 \00\00\00\04로 인코딩됩니다.
관련 항목