比較値を指定する方法

各属性の種類には、その属性の検索フィルターで指定できる比較値の種類を決定する構文があります。

次のセクションでは、各属性構文の要件について説明します。 属性構文の詳細については、 「Active Directory Domain Servicesの属性の構文」 を参照してください。

ブール型

フィルターで指定する値は、"TRUE"または"FALSE"のいずれかの文字列値である必要があります。 次の例では、ブール型の比較文字列を指定する方法を示します。

次の例では、showInAdvancedViewOnlyがTRUEに設定されているオブジェクトを検索します。

(showInAdvancedViewOnly=TRUE)

次の例では、showInAdvancedViewOnlyがFALSEに設定されているオブジェクトを検索します。

(showInAdvancedViewOnly=FALSE)

整数と列挙型

フィルターで指定する値は、10進数の整数である必要があります。 16進数の値は10進数に変換する必要があります。 値の比較文字列の形式は次のとおりです。

<attribute name>:<value>

"attribute name"は属性のlDAPDisplayNameで、"value"は比較に使用する値です。

次のコード例は、ADS_GROUP_TYPE_UNIVERSAL_GROUP (8) フラグとADS_GROUP_TYPE_SECURITY_ENABLED (0x80000000) フラグに等しいgroupType値を持つオブジェクトを検索するフィルターを示しています。 2つのフラグを組み合わせると0x80000008になり、10進数に変換すると2147483656になります。

(groupType=2147483656)

LDAP一致規則演算子を使用して、ビットごとの比較を実行することもできます。 一致規則の詳細については、 「検索フィルター構文」 を参照してください。 次のコード例は、ADS_GROUP_TYPE_SECURITY_ENABLED (0x80000000=2147483648) ビットが設定されたgroupTypeを持つオブジェクトを検索するフィルターを示しています。

(groupType:1.2.840.113556.1.4.803:=2147483648))

OctetString

フィルターで指定された値は、検索するデータです。 データは、各バイトの前に円記号(\)が付いた2文字のエンコードされたバイト文字列として表す必要があります。 たとえば、値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-193555697-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=ローカル+差分。

差分を指定するには、次を使用します。

YYYYMMDDHHMMSS.0[+/-]HHMM

次の例は、whenCreated時刻を3/23/99 8:52:58 PM GMTに設定するフィルターを示しています。

(whenCreated=19990323205258.0Z)

次の例は、whenCreated時刻を3/23/99 8:52:58 PMニュージーランド標準時 (差分は+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時刻を3/23/99 8:52:58 PM GMTに設定するフィルターを示しています。

(myTimeAttrib=990323205258Z)

次の例は、myTimeAttrib時刻を3/23/99 8:52:58 PMに設定し、秒を指定しないフィルターを示しています。

(myTimeAttrib=9903232052Z)

次の例は、myTimeAttrib時刻を3/23/99 8:52:58 PMニュージーランド標準時に設定するフィルターを示しています (差分は12時間) 。 これは3/23/99 8:52:58 AM GMTに相当します。

(myTimeAttrib=990323205258+1200)

DirectoryString

フィルターで指定する値は文字列です。 DirectoryStringにはUnicode文字を含めることができます。 比較では大文字と小文字は区別されません。

OID

一致するOID全体を指定する必要があります。

ワイルドカードは使用できません。

objectCategory属性を使用すると、属性に設定されたクラスのlDAPDisplayNameを指定できます。

次の例は、ボリュームクラスのgovernsIDを指定するフィルターを示しています。

(governsID=1.2.840.113556.1.5.36)

OIDが1.2.840.113556.1.4.137のuNCNameを含むsystemMustContain属性を指定する2つの同等のフィルター:

(SystemMustContain=uNCName)
 
(SystemMustContain=1.2.840.113556.1.4.137)

その他の構文

次の構文は、オクテット文字列に似たフィルターで評価されます。

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