Condividi tramite


Come specificare i valori di confronto

Ogni tipo di attributo ha una sintassi che determina il tipo di valori di confronto che è possibile specificare in un filtro di ricerca per tale attributo.

Le sezioni seguenti descrivono i requisiti per ogni sintassi degli attributi. Per altre informazioni sulla sintassi degli attributi, vedere Sintassi per attributi in Dominio di Active Directory Services.

Boolean

Il valore specificato in un filtro deve essere un valore stringa "TRUE" o "FAL edizione Standard". Negli esempi seguenti viene illustrato come specificare una stringa di confronto booleana.

L'esempio seguente cercherà gli oggetti con showInAdvancedViewOnly impostato su TRUE:

(showInAdvancedViewOnly=TRUE)

L'esempio seguente cercherà gli oggetti con showInAdvancedViewOnly impostato su FAL edizione Standard:

(showInAdvancedViewOnly=FALSE)

Integer ed enumerazione

Il valore specificato in un filtro deve essere un numero intero decimale. I valori esadecimali devono essere convertiti in decimali. Una stringa di confronto di valori ha il formato seguente:

<attribute name>:<value>

"<attribute name>" è lDAPDisplayName dell'attributo e "<value>" è il valore da usare per il confronto.

Nell'esempio di codice seguente viene illustrato un filtro che cercherà gli oggetti con un valore groupType uguale al flag ADS_GROUP_TYPE_UNIVERSAL_GROUP (8) e al flag ADS_GROUP_TYPE_edizione StandardCURITY_ENABLED (0x80000000). I due flag combinati sono uguali 0x80000008, che vengono convertiti in decimali 2147483656.

(groupType=2147483656)

Gli operatori delle regole di corrispondenza LDAP possono essere usati anche per eseguire confronti bit per bit. Per altre informazioni sulle regole di corrispondenza, vedere sintassi del filtro di ricerca. Nell'esempio di codice seguente viene illustrato un filtro che cercherà gli oggetti con un groupType con il set di bit ADS_GROUP_TYPE_edizione StandardCURITY_ENABLED (0x80000000 = 2147483648).

(groupType:1.2.840.113556.1.4.803:=2147483648))

OctetString

Il valore specificato in un filtro è costituito dai dati da trovare. I dati devono essere rappresentati come stringa di byte con codifica a due caratteri in cui ogni byte è preceduto da una barra rovesciata (\). Ad esempio, il valore 0x05 verrà visualizzato nella stringa come "\05".

La funzione ADsEncodeBinaryData può essere usata per creare una rappresentazione di stringa codificata di dati binari. La funzione ADsEncodeBinaryData non codifica i valori di byte che rappresentano caratteri alfanumerici. In alternativa, inserisce il carattere nella stringa senza codificarlo. Ciò comporta la stringa contenente una combinazione di caratteri codificati e non codificati. Ad esempio, se i dati binari sono 0x05|0x1A|0x1B|0x43|0x32, la stringa codificata conterrà "\05\1A\1BC2". Questo non ha alcun effetto sul filtro e i filtri di ricerca funzioneranno correttamente con questi tipi di stringhe.

I caratteri jolly vengono accettati.

Nell'esempio di codice seguente viene illustrato un filtro contenente una stringa codificata per schemaIDGUID con valore GUID "{BF967ABA-0DE6-11D0-A285-00AA003049E2}":

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

Sid

Il valore specificato in un filtro è la rappresentazione di stringa di byte codificata del SID. Per altre informazioni sulle stringhe di byte codificate, vedere la sezione precedente di questo argomento che illustra la sintassi OctetString.

L'esempio di codice seguente mostra un filtro che contiene una stringa codificata per objectSid con valore stringa SID "S-1-5-21-193565697-308236825-1417001333":

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

DN

È necessario specificare l'intero nome distinto, che deve corrispondere.

I caratteri jolly non vengono accettati.

Tenere presente che l'attributo objectCategory consente anche di specificare lDAPDisplayNamedella classe impostata sull'attributo .

Nell'esempio seguente viene illustrato un filtro che specifica un membro contenente "CN=TestUser,DC=Fabrikam,DC=COM":

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

INTEGER8

Il valore specificato in un filtro deve essere un numero intero decimale. Convertire i valori esadecimali in decimali.

L'esempio di codice seguente mostra un filtro che specifica un valore creationTime impostato su fileTIME "1999-12-31 23:59:59 (UTC/GMT)":

(creationTime=125911583990000000)

Le funzioni seguenti creano un filtro di corrispondenza esatta (=) per un attributo integer di grandi dimensioni e verificare l'attributo nello schema e la relativa sintassi:

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

Gli attributi con queste sintassi devono essere conformi a set di caratteri specifici. Per altre informazioni, vedere Sintassi per gli attributi in Dominio di Active Directory Services.

Attualmente, i servizi di Dominio di Active Directory non applicano tali set di caratteri.

Il valore specificato in un filtro è una stringa. Il confronto fa distinzione tra maiuscole e minuscole.

GeneralizedTime

Il valore specificato in un filtro è una stringa che rappresenta la data nel formato seguente:

YYYYMMDDHHMMSS.0Z

"0Z" indica che non si è verificato alcun differenziale temporale. Tenere presente che il server Active Directory archivia data/ora come Ora di Greenwich (GMT). Se non viene specificato un differenziale temporale, il valore predefinito è GMT.

Se il fuso orario locale non è GMT, usare un valore differenziale per specificare il fuso orario locale e applicare il differenziale a GMT. Il differenziale si basa su: GMT=Local+differenziale.

Per specificare un differenziale, usare:

YYYYMMDDHHMMSS.0[+/-]HHMM

Nell'esempio seguente viene illustrato un filtro che specifica un valore quando l'ora di creazione è impostata su 3/23/99 8:52:58 PM GMT:

(whenCreated=19990323205258.0Z)

L'esempio seguente mostra un filtro che specifica un'ora in cui l'ora di creazione è impostata su 3/23/99 8:52:58 ORA solare nuova Zelanda (differenziale è +12 ore):

(whenCreated=19990323205258.0+1200)

Nell'esempio di codice seguente viene illustrato come calcolare il differenziale del fuso orario. La funzione restituisce il differenziale tra il fuso orario locale corrente e GMT. Il valore restituito è una stringa nel formato seguente:

[+/-]HHMM

Ad esempio, 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

Il valore specificato in un filtro è una stringa che rappresenta la data nel formato seguente:

YYMMDDHHMMSSZ

Z indica che non è previsto alcun differenziale temporale. Tenere presente che il server Active Directory archivia data e ora come ora GMT. Se non viene specificato un differenziale temporale, GMT è il valore predefinito.

Il valore dei secondi ("SS") è facoltativo.

Se GMT non è il fuso orario locale, applicare un valore differenziale locale per specificare il fuso orario locale. Il differenziale è: GMT=Local+differenziale.

Per specificare un differenziale, utilizzare il formato seguente:

YYMMDDHHMMSS[+/-]HHMM

L'esempio seguente mostra un filtro che specifica un'ora myTimeAttrib impostata su 3/23/99 8:52:58 PM GMT:

(myTimeAttrib=990323205258Z)

L'esempio seguente mostra un filtro che specifica un'ora myTimeAttrib impostata su 3/23/99 8:52:58 PM senza secondi specificati:

(myTimeAttrib=9903232052Z)

L'esempio seguente mostra un filtro che specifica un'ora myTimeAttrib impostata su 3/23/99 8:52:58 Ora solare nuova Zelanda (differenziale è 12 ore). Equivale al 23/3/99 8:52:58 GMT.

(myTimeAttrib=990323205258+1200)

DirectoryString

Il valore specificato in un filtro è una stringa. DirectoryString può contenere caratteri Unicode. Il confronto non fa distinzione tra maiuscole e minuscole.

OID

È necessario specificare l'intero OID da associare.

I caratteri jolly non vengono accettati.

L'attributo objectCategory consente di specificare lDAPDisplayNamedel set di classi per l'attributo .

L'esempio seguente mostra un filtro che specifica governsID per la classe volume:

(governsID=1.2.840.113556.1.5.36)

Due filtri equivalenti che specificano l'attributo systemMustContain contenente uNCName, che ha un OID 1.2.840.113556.1.4.137:

(SystemMustContain=uNCName)
 
(SystemMustContain=1.2.840.113556.1.4.137)

Altre sintassi

Le sintassi seguenti vengono valutate in un filtro simile a una stringa ottetto:

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