如何指定比较值
每个属性类型都有一个语法,用于确定可以在该属性的搜索筛选器中指定的比较值的类型。
以下各节介绍每个属性语法的要求。 有关属性语法的详细信息,请参阅Active Directory 域服务中属性的语法。
-
布尔
-
筛选器中指定的值必须是“TRUE”或“FAL标准版”的字符串值。 以下示例演示如何指定布尔比较字符串。
以下示例将搜索 showInAdvancedViewOnly 设置为 TRUE 的对象:
(showInAdvancedViewOnly=TRUE)
以下示例将搜索 showInAdvancedViewOnly 设置为 FAL 的对象标准版:
(showInAdvancedViewOnly=FALSE)
-
整数和枚举
-
筛选器中指定的值必须是十进制整数。 必须将十六进制值转换为十进制值。 值比较字符串采用以下形式:
<attribute name>:<value>
“<attribute name>”是 特性的 lDAPDisplayName ,“<value>”是用于比较的值。
下面的代码示例显示了一个筛选器,该筛选器将搜索一个 groupType 值等于 ADS_GROUP_TYPE_UNIVERSAL_GROUP (8) 标志和ADS_GROUP_TYPE_标准版CURITY_ENABLED (0x80000000) 标志的对象。 两个标志组合为相等0x80000008,转换为十进制2147483656。
(groupType=2147483656)
LDAP 匹配规则运算符还可用于执行按位比较。 有关匹配规则的详细信息,请参阅 搜索筛选器语法。 下面的代码示例显示了一个筛选器,该筛选器将搜索具有具有 ADS_GROUP_TYPE_标准版CURITY_ENABLED (0x80000000 = 2147483648) 位集的 groupType 的对象。
(groupType:1.2.840.113556.1.4.803:=2147483648))
-
OctetString
-
筛选器中指定的值是要找到的数据。 数据必须表示为两个字符编码的字节字符串,其中每个字节前面有一个反斜杠(\)。 例如,0x05的值将显示在字符串中为“\05”。
ADsEncodeBinaryData 函数可用于创建二进制数据的编码字符串表示形式。 ADsEncodeBinaryData 函数不对表示 alpha 数字字符的字节值进行编码。 相反,它会将字符放入字符串中,而无需对其进行编码。 这会导致包含已编码字符和未编码字符混合的字符串。 例如,如果二进制数据0x05|0x1A|0x1B|0x43|0x32,则编码的字符串将包含“\05\1A\1BC2”。 这不会影响筛选器,搜索筛选器将使用这些类型的字符串正常工作。
可以使用通配符。
下面的代码示例显示了一个筛选器,其中包含 GUID 值为“{BF967ABA-0DE6-11D0-A285-00AA003049E2}”的 schemaIDGUID 编码字符串:
(schemaidguid=\BA\7A\96\BF\E6\0D\D0\11\A2\85\00\AA\00\30\49\E2)
-
Sid
-
筛选器中指定的值是 SID 的编码字节字符串表示形式。 有关编码字节字符串的详细信息,请参阅本主题中的上一部分,讨论 OctetString 语法。
下面的代码示例演示了一个筛选器,其中包含 SID 字符串值为“S-1-5-21-1935655697-308236825-1417001333”的 objectSid 的编码字符串:
(ObjectSid=\01\04\00\00\00\00\00\05\15\00\00\00\11\C3\5Fs\19R\5F\12u\B9uT)
-
Dn
-
必须提供要匹配的整个可分辨名称。
不接受 Wild卡。
请注意, objectCategory 属性还允许指定 特性上设置的类的 lDAPDisplayName 。
以下示例显示了一个 筛选器,该筛选器指定包含“CN=TestUser,DC=Fabrikam,DC=COM”的成员 :
(member=CN=TestUser,DC=Fabrikam,DC=COM)
-
INTEGER8
-
筛选器中指定的值必须是十进制整数。 将十六进制值转换为十进制值。
下面的代码示例显示了一个筛选器,该筛选器指定将 creationTime 设置为“1999-12-31 23:59:59(UTC/GMT)”的 FILETIME:
(creationTime=125911583990000000)
以下函数为大型整数属性创建完全匹配 (=) 筛选器,并验证架构及其语法中的属性:
//*************************************************************************** // // CheckAttribute() // //*************************************************************************** HRESULT CheckAttribute(LPOLESTR szAttribute, LPOLESTR szSyntax) { HRESULT hr = E_FAIL; BSTR bstr; IADsProperty *pObject = NULL; LPWSTR szPrefix = L"LDAP://schema/"; LPWSTR szPath; if((!szAttribute) || (!szSyntax)) { return E_POINTER; } // Allocate a buffer large enough to hold the ADsPath of the attribute. szPath = new WCHAR[lstrlenW(szPrefix) + lstrlenW(szAttribute) + 1]; if(NULL == szPath) { return E_OUTOFMEMORY; } // Create the ADsPath of the attribute. wcscpy_s(szPath, szPrefix); wcscat_s(szPath, szAttribute); hr = ADsOpenObject( szPath, NULL, NULL, ADS_SECURE_AUTHENTICATION, // Use Secure Authentication. IID_IADsProperty, (void**)&pObject); if(SUCCEEDED(hr)) { hr = pObject->get_Syntax(&bstr); if (SUCCEEDED(hr)) { if (0==lstrcmpiW(bstr, szSyntax)) { hr = S_OK; } else { hr = S_FALSE; } } SysFreeString(bstr); } if(pObject) { pObject->Release(); } delete szPath; return hr; } //*************************************************************************** // // CreateExactMatchFilterLargeInteger() // //*************************************************************************** HRESULT CreateExactMatchFilterLargeInteger( LPOLESTR szAttribute, INT64 liValue, LPOLESTR *pszFilter) { HRESULT hr = E_FAIL; if ((!szAttribute) || (!pszFilter)) { return E_POINTER; } // Verify that the attribute exists and has // Integer8 (Large Integer) syntax. hr = CheckAttribute(szAttribute, L"Integer8"); if (S_OK == hr) { LPWSTR szFormat = L"%s=%I64d"; LPWSTR szTempFilter = new WCHAR[lstrlenW(szFormat) + lstrlenW(szAttribute) + 20 + 1]; if(NULL == szTempFilter) { return E_OUTOFMEMORY; } swprintf_s(szTempFilter, L"%s=%I64d", szAttribute, liValue); // Allocate buffer for the filter string. // Caller must free the buffer using CoTaskMemFree. *pszFilter = (OLECHAR *)CoTaskMemAlloc(sizeof(OLECHAR) * (lstrlenW(szTempFilter) + 1)); if (*pszFilter) { wcscpy_s(*pszFilter, szTempFilter); hr = S_OK; } else { hr = E_OUTOFMEMORY; } delete szTempFilter; } return hr; }
-
PrintableString
-
具有这些语法的属性应遵循特定的字符集。 有关详细信息,请参阅 Active Directory 域服务 中属性的语法。
目前,Active Directory 域服务不强制实施这些字符集。
筛选器中指定的值是字符串。 比较是区分大小写的。
-
GeneralizedTime
-
筛选器中指定的值是一个字符串,表示以下形式的日期:
YYYYMMDDHHMMSS.0Z
“0Z”表示没有时间差异。 请注意,Active Directory 服务器将日期/时间存储为格林威治平均时间(GMT)。 如果未指定时间差异,则默认值为 GMT。
如果本地时区不是 GMT,请使用差异值指定本地时区并将差异应用于 GMT。 差异基于:GMT=Local+differential。
若要指定差异,请使用:
YYYYMMDDHHMMSS.0[+/-]HHMM
以下示例显示了一个筛选器,该 筛选器指定设置为 3/23/99 下午 8:52:58 的 TimeCreated 时间:
(whenCreated=19990323205258.0Z)
以下示例演示了一个筛选器,该筛选器指定设置为 3/23/99 下午 8:52:58(差异为 +12 小时):3/23/99 下午 8:52:58:
(whenCreated=19990323205258.0+1200)
下面的代码示例演示如何计算时区差异。 该函数返回当前本地时区与 GMT 之间的差异。 返回的值是采用以下格式的字符串:
[+/-]HHMM
例如,太平洋标准时间为 -0800。
//*************************************************************************** // // GetLocalTimeZoneDifferential() // //*************************************************************************** HRESULT GetLocalTimeZoneDifferential(LPOLESTR *pszDifferential) { if(NULL == pszDifferential) { return E_INVALIDARG; } HRESULT hr = E_FAIL; DWORD dwReturn; TIME_ZONE_INFORMATION timezoneinfo; LONG lTimeDifferential; LONG lHours; LONG lMinutes; dwReturn = GetTimeZoneInformation(&timezoneinfo); switch (dwReturn) { case TIME_ZONE_ID_STANDARD: lTimeDifferential = timezoneinfo.Bias + timezoneinfo.StandardBias; // Bias is in minutes. Calculate the hours for HHMM format. lHours = -(lTimeDifferential/60); // Bias is in minutes. Calculate the minutes for HHMM format. lMinutes = lTimeDifferential%60L; hr = S_OK; break; case TIME_ZONE_ID_DAYLIGHT: lTimeDifferential = timezoneinfo.Bias + timezoneinfo.DaylightBias; // Bias is in minutes. Calculate the hours for HHMM format. // Apply the additive inverse. // Bias is based on GMT=Local+Bias. // A differential, based on GMT=Local-Bias, is required. lHours = -(lTimeDifferential/60); // Bias is in minutes. Calculate the minutes for HHMM format. lMinutes = lTimeDifferential%60L; hr = S_OK; break; case TIME_ZONE_ID_INVALID: default: hr = E_FAIL; break; } if (SUCCEEDED(hr)) { // The caller must free the memory using CoTaskMemFree. *pszDifferential = (OLECHAR *)CoTaskMemAlloc(sizeof(OLECHAR) * (3 + 2 + 1)); if (*pszDifferential) { swprintf_s(*pszDifferential, L"%+03d%02d", lHours, lMinutes); hr = S_OK; } else { hr = E_OUTOFMEMORY; } } return hr; }
-
UTCTime
-
筛选器中指定的值是一个字符串,表示以下形式的日期:
YYMMDDHHMMSSZ
Z 表示没有时间差异。 请注意,Active Directory 服务器将日期和时间存储为 GMT 时间。 如果未指定时间差异,则 GMT 为默认值。
秒值(“SS”)是可选的。
如果 GMT 不是本地时区,请应用本地差异值来指定本地时区。 差异为:GMT=Local+differential。
若要指定差异,请使用以下形式:
YYMMDDHHMMSS[+/-]HHMM
以下示例显示了一个筛选器,该 筛选器指定设置为 3/23/99 下午 8:52:58 的 myTimeAttrib 时间:
(myTimeAttrib=990323205258Z)
以下示例显示了一个筛选器,该 筛选器指定设置为 3/23/99 8:52:58 PM 且未指定秒的 myTimeAttrib 时间:
(myTimeAttrib=9903232052Z)
以下示例显示了一个筛选器,该 筛选器指定设置为 3/23/99 下午 8:52:58 的 myTimeAttrib 时间(差异为 12 小时)。 这相当于格林尼治标准时间上午 3/23/8:52:58。
(myTimeAttrib=990323205258+1200)
-
DirectoryString
-
筛选器中指定的值是字符串。 DirectoryString 可以包含 Unicode 字符。 比较不区分大小写。
-
老
-
必须提供要匹配的整个 OID。
不接受 Wild卡。
通过 objectCategory 属性,可以指定 特性的类集的 lDAPDisplayName 。
以下示例显示了一个筛选器,该筛选器指定 卷类的 governsID :
(governsID=1.2.840.113556.1.5.36)
两个等效筛选器,用于指定包含 uNCName 的 systemMustContain 属性,其 OID 为 1.2.840.113556.1.4.137:
(SystemMustContain=uNCName) (SystemMustContain=1.2.840.113556.1.4.137)
-
其他语法
-
以下语法在类似于八进制字符串的筛选器中计算:
- ObjectSecurityDescriptor
- AccessPointDN
- PresentationAddresses
- ReplicaLink
- DNWithString
- DNWithOctetString
- ORName