Поделиться через


Указание значений сравнения

Каждый тип атрибута имеет синтаксис, определяющий тип значений сравнения, которые можно указать в фильтре поиска для этого атрибута.

В следующих разделах описываются требования для каждого синтаксиса атрибута. Дополнительные сведения о синтаксисах атрибутов см. в разделе «Синтаксисы атрибутов в доменных службах 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