Freigeben über


Angeben von Vergleichswerten

Jeder Attributtyp verfügt über eine Syntax, die den Typ der Vergleichswerte bestimmt, die Sie in einem Suchfilter für dieses Attribut angeben können.

In den folgenden Abschnitten werden die Anforderungen für jede Attributsyntax beschrieben. Weitere Informationen zu Attributsyntaxen finden Sie unter Syntaxen für Attribute in Active Directory Domain Services.

Boolean

Der in einem Filter angegebene Wert muss ein Zeichenfolgenwert sein, der entweder "TRUE" oder "FALSE" ist. Die folgenden Beispiele zeigen, wie Eine boolesche Vergleichszeichenfolge angegeben wird.

Im folgenden Beispiel wird nach Objekten gesucht, deren showInAdvancedViewOnly auf TRUE festgelegt ist:

(showInAdvancedViewOnly=TRUE)

Im folgenden Beispiel wird nach Objekten gesucht, deren showInAdvancedViewOnly auf FALSE festgelegt ist:

(showInAdvancedViewOnly=FALSE)

Ganze Zahl und Enumeration

Der in einem Filter angegebene Wert muss eine dezimale Ganze Zahl sein. Hexadezimalwerte müssen in dezimal konvertiert werden. Eine Wertvergleichszeichenfolge hat die folgende Form:

<attribute name>:<value>

"<Attributname>" ist der lDAPDisplayName des Attributs, und "<value>" ist der Wert, der für den Vergleich verwendet werden soll.

Das folgende Codebeispiel zeigt einen Filter, der nach Objekten sucht, die über einen groupType-Wert verfügen, der dem Flag ADS_GROUP_TYPE_UNIVERSAL_GROUP (8) und dem flag ADS_GROUP_TYPE_SECURITY_ENABLED (0x80000000) entspricht. Die beiden kombinierten Flags entsprechen 0x80000008, die in dezimal konvertiert werden, ist 2147483656.

(groupType=2147483656)

Die LDAP-Abgleichsregeloperatoren können auch verwendet werden, um bitweise Vergleiche durchzuführen. Weitere Informationen zu Abgleichsregeln finden Sie unter Suchfiltersyntax. Das folgende Codebeispiel zeigt einen Filter, der nach Objekten sucht, deren groupType mit dem ADS_GROUP_TYPE_SECURITY_ENABLED -Bit (0x80000000 = 2147483648) festgelegt ist.

(groupType:1.2.840.113556.1.4.803:=2147483648))

OctetString

Der in einem Filter angegebene Wert ist die zu findenden Daten. Die Daten müssen als zweistellige codierte Bytezeichenfolge dargestellt werden, wobei jedem Byte ein umgekehrter Schrägstrich (\) vorangestellt ist. Beispielsweise wird der Wert 0x05 in der Zeichenfolge als "\05" angezeigt.

Die Funktion ADsEncodeBinaryData kann verwendet werden, um eine codierte Zeichenfolgendarstellung von Binärdaten zu erstellen. Die ADsEncodeBinaryData-Funktion codiert keine Bytewerte, die alphanumerische Zeichen darstellen. Stattdessen wird das Zeichen ohne Codierung in die Zeichenfolge eingefügt. Dies führt dazu, dass die Zeichenfolge eine Mischung aus codierten und nicht codierten Zeichen enthält. Wenn die Binärdaten beispielsweise 0x05|0x1A|0x1B|0x43|0x32 sind, enthält die codierte Zeichenfolge "\05\1A\1BC2". Dies hat keine Auswirkungen auf den Filter, und die Suchfilter funktionieren mit diesen Zeichenfolgentypen ordnungsgemäß.

Wildcards werden akzeptiert.

Das folgende Codebeispiel zeigt einen Filter, der eine codierte Zeichenfolge für schemaIDGUID mit dem GUID-Wert "{BF967ABA-0DE6-11D0-A285-00AA003049E2}" enthält:

(schemaidguid=\BA\7A\96\BF\E6\0D\D0\11\A2\85\00\AA\00\30\49\E2)

Sid

Der in einem Filter angegebene Wert ist die codierte Bytezeichenfolgendarstellung der SID. Weitere Informationen zu codierten Bytezeichenfolgen finden Sie im vorherigen Abschnitt in diesem Thema, in dem die OctetString-Syntax erläutert wird.

Das folgende Codebeispiel zeigt einen Filter, der eine codierte Zeichenfolge für objectSid mit dem SID-Zeichenfolgenwert "S-1-5-21-1935655697-308236825-1417001333" enthält:

(ObjectSid=\01\04\00\00\00\00\00\05\15\00\00\00\11\C3\5Fs\19R\5F\12u\B9uT)

DN

Der gesamte distinguished Name muss angegeben werden, um abgeglichen zu werden.

Wildcards werden nicht akzeptiert.

Beachten Sie, dass Sie mit dem objectCategory-Attribut auch den lDAPDisplayName der Klasse angeben können, die für das Attribut festgelegt ist.

Das folgende Beispiel zeigt einen Filter, der einen Member angibt, der "CN=TestUser,DC=Fabrikam,DC=COM" enthält:

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

GANZZAHL8

Der in einem Filter angegebene Wert muss eine dezimale ganzzahlige Zahl sein. Konvertieren sie Hexadezimalwerte in dezimale Werte.

Das folgende Codebeispiel zeigt einen Filter, der einen creationTime-Wert angibt, der auf eine FILETIME von "1999-12-31 23:59:59 (UTC/GMT)" festgelegt ist:

(creationTime=125911583990000000)

Die folgenden Funktionen erstellen einen exakten Übereinstimmungsfilter (=) für ein großes ganzzahliges Attribut und überprüfen das Attribut im Schema und seine Syntax:

//***************************************************************************
//
//  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

Attribute mit diesen Syntaxen sollten bestimmten Zeichensätzen entsprechen. Weitere Informationen finden Sie unter Syntaxen für Attribute in Active Directory Domain Services.

Derzeit erzwingen Active Directory Domain Services diese Zeichensätze nicht.

Der in einem Filter angegebene Wert ist eine Zeichenfolge. Beim Vergleich wird die Groß-/Kleinschreibung beachtet.

GeneralizedTime

Der in einem Filter angegebene Wert ist eine Zeichenfolge, die das Datum in der folgenden Form darstellt:

YYYYMMDDHHMMSS.0Z

"0Z" gibt keine Zeitdifferenz an. Beachten Sie, dass der Active Directory-Server Datum/Uhrzeit als Greenwich Mean Time (GMT) speichert. Wenn kein Zeitdifferenzial angegeben wird, ist der Standardwert GMT.

Wenn die lokale Zeitzone nicht GMT ist, verwenden Sie einen differenziellen Wert, um Ihre lokale Zeitzone anzugeben und die Differenz auf GMT anzuwenden. Das Differenzial basiert auf: GMT=Local+differential.

Verwenden Sie Folgendes, um ein Differenzial anzugeben:

YYYYMMDDHHMMSS.0[+/-]HHMM

Das folgende Beispiel zeigt einen Filter, der eine whenCreated-Zeit angibt, die auf den 23.03.99 20:52:58 GMT festgelegt ist:

(whenCreated=19990323205258.0Z)

Das folgende Beispiel zeigt einen Filter, der eine WhenCreated-Zeit angibt, die auf 23.03.99 20:52:58 Uhr Neuseeländische Normalzeit festgelegt ist (differenziert beträgt +12 Stunden):

(whenCreated=19990323205258.0+1200)

Im folgenden Codebeispiel wird gezeigt, wie Sie das Zeitzonendifferential berechnen. Die Funktion gibt den Unterschied zwischen der aktuellen lokalen Zeitzone und GMT zurück. Der zurückgegebene Wert ist eine Zeichenfolge im folgenden Format:

[+/-]HHMM

Die Pacific Standard Time ist z. B. -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

Der in einem Filter angegebene Wert ist eine Zeichenfolge, die das Datum in der folgenden Form darstellt:

YYMMDDHHMMSSZ

Z gibt keine Zeitdifferenz an. Beachten Sie, dass der Active Directory-Server Datum und Uhrzeit als GMT-Zeit speichert. Wenn kein Zeitdifferenzial angegeben wird, ist GMT die Standardeinstellung.

Der Sekundenwert ("SS") ist optional.

Wenn GMT nicht die lokale Zeitzone ist, wenden Sie einen lokalen differenziellen Wert an, um Ihre lokale Zeitzone anzugeben. Das Differenzial ist: GMT=Local+differential.

Verwenden Sie das folgende Formular, um ein Differenzial anzugeben:

YYMMDDHHMMSS[+/-]HHMM

Das folgende Beispiel zeigt einen Filter, der eine myTimeAttrib-Zeit angibt, die auf den 23.03.99 20:52:58 GMT festgelegt ist:

(myTimeAttrib=990323205258Z)

Das folgende Beispiel zeigt einen Filter, der eine myTimeAttrib-Zeit angibt, die auf 23.03.99 20:52:58 Uhr festgelegt ist, ohne dass Sekunden angegeben sind:

(myTimeAttrib=9903232052Z)

Das folgende Beispiel zeigt einen Filter, der eine myTimeAttrib-Zeit angibt, die auf 23.03.99 20:52:58 Uhr neuseeländische Normalzeit festgelegt ist (differenziert 12 Stunden). Dies entspricht 23.03.99 8:52:58 GMT.

(myTimeAttrib=990323205258+1200)

DirectoryString

Der in einem Filter angegebene Wert ist eine Zeichenfolge. DirectoryString kann Unicode-Zeichen enthalten. Bei dem Vergleich wird Groß- und Kleinschreibung nicht unterschieden.

OID

Die gesamte abzugleichende OID muss angegeben werden.

Wildcards werden nicht akzeptiert.

Mit dem objectCategory-Attribut können Sie den lDAPDisplayName der Klasse angeben, die für das Attribut festgelegt ist.

Das folgende Beispiel zeigt einen Filter, der governsID für die Volumeklasse angibt:

(governsID=1.2.840.113556.1.5.36)

Zwei äquivalente Filter, die das systemMustContain-Attribut angeben, das uNCName enthält, das eine OID von 1.2.840.113556.1.4.137 aufweist:

(SystemMustContain=uNCName)
 
(SystemMustContain=1.2.840.113556.1.4.137)

Andere Syntaxen

Die folgenden Syntaxen werden in einem Filter ausgewertet, der einer Oktettzeichenfolge ähnelt:

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