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


Как указать значения для сравнения

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

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

(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

Значение, указанное в фильтре, должно быть десятичным целым числом. Преобразуйте шестнадцатеричные значения в десятичное значение.

В следующем примере кода показан фильтр, указывающий время создания, заданное для 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 не применяют эти наборы символов.

Значение, указанное в фильтре, является строкой. Сравнение учитывает регистр.

GeneralizedTime

Значение, указанное в фильтре, — это строка, представляющая дату в следующей форме:

YYYYMMDDHHMMSS.0Z

Значение "0Z" указывает, что время не разностно. Помните, что сервер Active Directory сохраняет дату и время в качестве среднего времени Гринвича (GMT). Если разностное время не указано, значение по умолчанию — GMT.

Если локальный часовой пояс не является GMT, используйте разностное значение для указания локального часового пояса и применения разностного пояса к GMT. Разностная функция основана на: GMT=Local+differential.

Чтобы указать разностную, используйте:

YYYYMMDDHHMMSS.0[+/-]HHMM

В следующем примере показан фильтр, указывающий время создания , заданное для 3.23.99 8:52:58 GMT:

(whenCreated=19990323205258.0Z)

В следующем примере показан фильтр, указывающий время создания , заданное 3/23/99 8:52: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=Local+differential.

Чтобы указать разностную форму, используйте следующую форму:

YYMMDDHHMMSS[+/-]HHMM

В следующем примере показан фильтр, указывающий время myTimeAttrib , заданное для 3/23/99 8:52:58 PM GMT:

(myTimeAttrib=990323205258Z)

В следующем примере показан фильтр, указывающий время myTimeAttrib , заданное для 3/23/99 8:52:58 вечера без указанных секунд:

(myTimeAttrib=9903232052Z)

В следующем примере показан фильтр, указывающий время myTimeAttrib , равное 3/23/99 8:52:58:58 Стандартное время Новой Зеландии (разностное значение составляет 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)

Другие синтаксисы

Следующие синтаксисы оцениваются в фильтре, аналогично строке октета:

  • ObjectSecurityDescriptor
  • AccessPointDN
  • PresentationAddresses
  • ReplicaLink
  • DNWithString
  • DNWithOctetString
  • ORName