비교 값을 지정하는 방법

각 특성 형식에는 해당 특성에 대한 검색 필터에서 지정할 수 있는 비교 값의 형식을 결정하는 구문이 있습니다.

다음 섹션에서는 각 특성 구문에 대한 요구 사항을 설명합니다. 특성 구문에 대한 자세한 내용은 Active Directory Domain Services 특성 구문을 참조하세요.

부울

필터에 지정된 값은 "TRUE" 또는 "FALSE"인 문자열 값이어야 합니다. 다음 예제에서는 부울 비교 문자열을 지정하는 방법을 보여 줍니다.

다음 예제에서는 showInAdvancedViewOnlyTRUE로 설정된 개체를 검색합니다.

(showInAdvancedViewOnly=TRUE)

다음 예제에서는 showInAdvancedViewOnlyFALSE로 설정된 개체를 검색합니다.

(showInAdvancedViewOnly=FALSE)

정수 및 열거형

필터에 지정된 값은 10진수 정수여야 합니다. 16진수 값은 10진수로 변환해야 합니다. 값 비교 문자열은 다음 형식을 사용합니다.

<attribute name>:<value>

"<특성 이름>"은 특성의 lDAPDisplayName 이고 "<value>"는 비교에 사용할 값입니다.

다음 코드 예제에서는 groupType 값이 ADS_GROUP_TYPE_UNIVERSAL_GROUP(8) 플래그 및 ADS_GROUP_TYPE_SECURITY_ENABLED(0x80000000) 플래그와 같은 개체를 검색하는 필터를 보여 줍니다. 같음 0x80000008 결합된 두 플래그는 10진수로 변환되는 2147483656.

(groupType=2147483656)

LDAP 일치 규칙 연산자를 사용하여 비트 비교를 수행할 수도 있습니다. 일치 규칙에 대한 자세한 내용은 검색 필터 구문을 참조하세요. 다음 코드 예제에서는 ADS_GROUP_TYPE_SECURITY_ENABLED(0x80000000 = 2147483648) 비트 집합이 있는 groupType이 있는 개체를 검색하는 필터를 보여 줍니다.

(groupType:1.2.840.113556.1.4.803:=2147483648))

OctetString

필터에 지정된 값은 찾을 데이터입니다. 데이터는 각 바이트 앞에 백슬래시(\)가 오는 두 문자로 인코딩된 바이트 문자열로 표현되어야 합니다. 예를 들어 0x05 값은 문자열에 "\05"로 표시됩니다.

ADsEncodeBinaryData 함수를 사용하여 이진 데이터의 인코딩된 문자열 표현을 만들 수 있습니다. ADsEncodeBinaryData 함수는 알파 숫자 문자를 나타내는 바이트 값을 인코딩하지 않습니다. 대신 인코딩하지 않고 문자열에 문자를 배치합니다. 이렇게 하면 인코딩된 문자와 인코딩되지 않은 문자가 혼합된 문자열이 포함됩니다. 예를 들어 이진 데이터가 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

일치하려면 고유 이름 전체를 제공해야 합니다.

와일드카드는 허용되지 않습니다.

objectCategory 특성을 사용하면 특성에 설정된 클래스의 lDAPDisplayName을 지정할 수도 있습니다.

다음 예제에서는 "CN=TestUser,DC=Fabrikam,DC=COM"이 포함된 멤버 를 지정하는 필터를 보여 줍니다.

(member=CN=TestUser,DC=Fabrikam,DC=COM)

INTEGER8

필터에 지정된 값은 10진수 정수여야 합니다. 16진수 값을 10진수로 변환합니다.

다음 코드 예제에서는 "1999-12-31 23:59:59(UTC/GMT)"의 FILETIME으로 설정된 creationTime을 지정하는 필터를 보여 줍니다.

(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 Domain Services 특성 구문을 참조하세요.

현재 Active Directory Domain Services 해당 문자 집합을 적용하지 않습니다.

필터에 지정된 값은 문자열입니다. 비교는 대/소문자를 구분합니다.

GeneralizedTime

필터에 지정된 값은 다음 형식의 날짜를 나타내는 문자열입니다.

YYYYMMDDHHMMSS.0Z

"0Z"는 시간 차등이 없음을 나타냅니다. Active Directory 서버는 날짜/시간을 그리니치 표준시(GMT)로 저장합니다. 시간 차등을 지정하지 않으면 기본값은 GMT입니다.

현지 표준 시간대가 GMT가 아닌 경우 차등 값을 사용하여 현지 표준 시간대를 지정하고 GMT에 차등을 적용합니다. 차등은 GMT=Local+차등을 기반으로 합니다.

차등을 지정하려면 다음을 사용합니다.

YYYYMMDDHHMMSS.0[+/-]HHMM

다음 예제에서는 오후 3/23/99 8:52:58 GMT로 설정된 시간을 지정 하는 필터를 보여줍니다.

(whenCreated=19990323205258.0Z)

다음 예제에서는 뉴질랜드 표준시( 차등은 +12시간)로 설정된 시간을 3/23/99 8:52:58로 설정하는 경우를 지정하는 필터를 보여줍니다.

(whenCreated=19990323205258.0+1200)

다음 코드 예제에서는 표준 시간대 차등을 계산하는 방법을 보여 줍니다. 함수는 현재 현지 표준 시간대와 GMT 간의 차등을 반환합니다. 반환되는 값은 다음 형식의 문자열입니다.

[+/-]HHMM

예를 들어 Pacific Standard Time은 -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+차등입니다.

차등을 지정하려면 다음 양식을 사용합니다.

YYMMDDHHMMSS[+/-]HHMM

다음 예제에서는 오후 3시 23분 99분 8시 52분 58분 GMT로 설정된 myTimeAttrib 시간을 지정하는 필터를 보여줍니다.

(myTimeAttrib=990323205258Z)

다음 예제에서는 myTimeAttrib 시간을 지정하지 않고 오후 3/23/99 8:52:58로 설정된 필터를 보여줍니다.

(myTimeAttrib=9903232052Z)

다음 예제에서는 myTimeAttrib 시간을 3/23/99 8:52:58 뉴질랜드 표준시(차등은 12시간)로 설정하도록 지정하는 필터를 보여 줍니다. 이는 오전 3/23/99 8:52:58 GMT에 해당합니다.

(myTimeAttrib=990323205258+1200)

DirectoryString

필터에 지정된 값은 문자열입니다. DirectoryString은 유니코드 문자를 포함할 수 있습니다. 비교는 대/소문자를 구분합니다.

Oid

일치시킬 전체 OID를 제공해야 합니다.

와일드카드는 허용되지 않습니다.

objectCategory 특성을 사용하면 특성에 대해 설정된 클래스의 lDAPDisplayName을 지정할 수 있습니다.

다음 예제에서는 볼륨 클래스에 대해 governsID를 지정하는 필터를 보여 줍니다.

(governsID=1.2.840.113556.1.5.36)

OID가 1.2.840.113556.1.4.137인 uNCName을 포함하는 systemMustContain 특성을 지정하는 두 개의 동일한 필터:

(SystemMustContain=uNCName)
 
(SystemMustContain=1.2.840.113556.1.4.137)

기타 구문

다음 구문은 옥텟 문자열과 유사한 필터에서 평가됩니다.

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