Указание значений сравнения
Каждый тип атрибута имеет синтаксис, определяющий тип значений сравнения, которые можно указать в фильтре поиска для этого атрибута.
В следующих разделах описываются требования для каждого синтаксиса атрибута. Дополнительные сведения о синтаксисах атрибутов см. в разделе «Синтаксисы атрибутов в доменных службах Active Directory».
-
Логическое
-
Значение, указанное в фильтре, должно быть строковым значением, равным "TRUE" или "FALSE". В следующих примерах показано, как указать логическую строку сравнения.
В следующем примере будет выполняться поиск объектов, у которых свойство showInAdvancedViewOnly установлено на TRUE.
(showInAdvancedViewOnly=TRUE)
В следующем примере будет осуществлён поиск объектов, у которых параметр showInAdvancedViewOnly установлен в FALSE:
(showInAdvancedViewOnly=FALSE)
-
Целое число и перечисление
-
Значение, указанное в фильтре, должно быть десятичным целым числом. Шестнадцатеричные значения должны быть преобразованы в десятичные. Строка сравнения значений принимает следующую форму:
<attribute name>:<value>
"<имя атрибута>" является lDAPDisplayName атрибута, а "<значение>" — это значение, используемое для сравнения.
В следующем примере кода показан фильтр, который будет искать объекты с значением groupType, равным флагу ADS_GROUP_TYPE_UNIVERSAL_GROUP (8) и флагу ADS_GROUP_TYPE_SECURITY_ENABLED (0x80000000). Два флага в сочетании равны 0x80000008, которые преобразуются в десятичное значение 2147483656.
(groupType=2147483656)
Операторы правила сопоставления LDAP также можно использовать для побитового сравнения. Дополнительные сведения о правилах сопоставления см. в синтаксисе фильтра поиска. В следующем примере кода показан фильтр, который будет искать объекты с groupType и установленным битом ADS_GROUP_TYPE_SECURITY_ENABLED (0x80000000 = 2147483648).
(groupType:1.2.840.113556.1.4.803:=2147483648))
-
OctetString
-
Значение, указанное в фильтре, — это найденные данные. Данные должны представляться в виде двух символьной строки байтов, в которой перед каждым байтом предшествует обратная косая черта (\). Например, значение 0x05 появится в строке как "\05".
Функцию ADsEncodeBinaryData можно использовать для создания закодированного строкового представления двоичных данных. Функция ADsEncodeBinaryData не кодирует байтовые значения, представляющие алфавитно-цифровые символы. Вместо этого он поместит символ в строку без кодирования. Это приводит к строке, содержащей смесь закодированных и незакодированных символов. Например, если двоичные данные 0x05|0x1A|0x1B|0x43|0x32, кодированная строка будет содержать "\05\1A\1BC2". Это не влияет на фильтр, и фильтры поиска будут работать правильно с этими типами строк.
Подстановочные знаки принимаются.
В следующем примере кода показан фильтр, содержащий закодированную строку для schemaIDGUID со значением GUID "{BF967ABA-0DE6-11D0-A285-00AA003049E2}":
(schemaidguid=\BA\7A\96\BF\E6\0D\D0\11\A2\85\00\AA\00\30\49\E2)
-
Sid
-
Значение, указанное в фильтре, — это закодированное строковое представление идентификатора безопасности. Дополнительные сведения о закодированных строках байтов см. в предыдущем разделе этого раздела, в котором описывается синтаксис OctetString.
В следующем примере кода показан фильтр, содержащий закодированную строку для объекта objectSid со строковым значением SID "S-1-5-21-1935655697-308236825-1417001333":
(ObjectSid=\01\04\00\00\00\00\00\05\15\00\00\00\11\C3\5Fs\19R\5F\12u\B9uT)
-
DN
-
Необходимо полностью указать отличительное имя для сопоставления.
Подстановочные знаки не принимаются.
Помните, что атрибут objectCategory также позволяет указать lDAPDisplayName класса, заданного в атрибуте.
В следующем примере показан фильтр, указывающий элемент , содержащий "CN=TestUser,DC=Fabrikam,DC=COM":
(member=CN=TestUser,DC=Fabrikam,DC=COM)
-
INTEGER8
-
Значение, указанное в фильтре, должно быть десятичным целым числом. Преобразуйте шестнадцатеричные значения в десятичное значение.
В следующем примере кода показан фильтр, указывающий creationTime для параметра FILETIME "1999-12-31 23:59:59 (UTC/GMT)":
(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 не применяют эти наборы символов.
Значение, указанное в фильтре, является строкой. Сравнение учитывает регистр.
-
ОбщееВремя
-
Значение, указанное в фильтре, — это строка, представляющая дату в следующей форме:
YYYYMMDDHHMMSS.0Z
Значение "0Z" указывает на отсутствие временной разницы. Помните, что сервер Active Directory сохраняет дату и время в качестве среднего времени Гринвича (GMT). Если разностное время не указано, значение по умолчанию — GMT.
Если локальный часовой пояс не является GMT, используйте разницу во времени для указания вашего местного часового пояса и применения этой разницы к GMT. Разностная функция основана на: GMT=Local+differential.
Чтобы указать разностную, используйте:
YYYYMMDDHHMMSS.0[+/-]HHMM
В следующем примере показан фильтр, который задаёт время создания , установленное на 23.03.99 20:52:58 по Гринвичу:
(whenCreated=19990323205258.0Z)
В следующем примере показан фильтр, указывающий при создании времени, заданного для 3/23/99 8:52:58:58 :58 Стандартное время Новой Зеландии (разностное значение равно +12 часам):
(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 = местное время + разница.
Чтобы указать дифференциал, используйте следующую форму:
YYMMDDHHMMSS[+/-]HHMM
В следующем примере показан фильтр, который задает для myTimeAttrib время 23.03.99 20:52:58 по Гринвичу.
(myTimeAttrib=990323205258Z)
В следующем примере показан фильтр, указывающий время для myTimeAttrib, установленное на 23.03.99 8:52:58 PM без указания секунд:
(myTimeAttrib=9903232052Z)
В следующем примере показан фильтр, который указывает время myTimeAttrib, установленное на 23.03.99 8:52:58 PM по новозеландскому стандартному времени (разница времени составляет 12 часов). Это эквивалентно 3.23.99 8:52:58 AM GMT.
(myTimeAttrib=990323205258+1200)
-
DirectoryString
-
Значение, указанное в фильтре, является строкой. DirectoryString может содержать символы Юникода. Сравнение не учитывает регистр.
-
OID
-
Необходимо указать весь идентификатор OID для сопоставления.
Подстановочные знаки не принимаются.
Атрибут objectCategory позволяет указать lDAPDisplayName набора классов для атрибута.
В следующем примере показан фильтр, указывающий, что определяет идентификатор для класса объёма:
(governsID=1.2.840.113556.1.5.36)
Два эквивалентных фильтра, указывающих атрибут systemMustContain, содержащий uNCName, имеющий OID 1.2.840.113556.1.4.137:
(SystemMustContain=uNCName) (SystemMustContain=1.2.840.113556.1.4.137)
-
другие синтаксисы
-
Следующие синтаксисы оцениваются в фильтре, аналогично строке октета:
- ДескрипторБезопасностиОбъекта
- AccessPointDN
- Адреса презентации
- ReplicaLink
- DNWithString
- DNWithOctetString
- ORName