Udostępnij za pośrednictwem


Jak określić wartości porównania

Każdy typ atrybutu ma składnię, która określa typ wartości porównania, które można określić w filtrze wyszukiwania dla tego atrybutu.

W poniższych sekcjach opisano wymagania dotyczące każdej składni atrybutu. Aby uzyskać więcej informacji na temat składni atrybutów, zobacz Składnie atrybutów w usługach Active Directory Domain Services.

Wartość Logiczna

Wartość określona w filtrze musi być wartością ciągu o wartości "TRUE" lub "FALSE". W poniższych przykładach pokazano, jak określić ciąg porównania boolowskiego.

W poniższym przykładzie zostaną wyszukane obiekty, które mają showInAdvancedViewOnly ustawione na TRUE:

(showInAdvancedViewOnly=TRUE)

W poniższym przykładzie zostaną wyszukane obiekty, dla których atrybut showInAdvancedViewOnly jest ustawiony na FALSE:

(showInAdvancedViewOnly=FALSE)

Integer i Enumeracja

Wartość określona w filtrze musi być liczbą całkowitą dziesiętną. Wartości szesnastkowe muszą być konwertowane na dziesiętne. Ciąg porównania wartości ma następującą formę:

<attribute name>:<value>

"<nazwa atrybutu>" to lDAPDisplayName atrybutu, a "<wartość>" to wartość używana do porównania.

Poniższy przykład kodu przedstawia filtr, który będzie wyszukiwać obiekty, które mają groupType wartość, która jest równa flagi ADS_GROUP_TYPE_UNIVERSAL_GROUP (8) i flagi ADS_GROUP_TYPE_SECURITY_ENABLED (0x80000000). Kombinacja dwóch flag daje wartość 0x80000008, co po przekonwertowaniu na dziesiętny odpowiada 2147483656.

(groupType=2147483656)

Operatory reguł dopasowywania LDAP mogą również służyć do wykonywania porównań bitowych. Aby uzyskać więcej informacji na temat dopasowywania reguł, zobacz Składnia filtru wyszukiwania. Poniższy przykład kodu przedstawia filtr, który będzie wyszukiwać obiekty, które mają groupType z zestawem bitów ADS_GROUP_TYPE_SECURITY_ENABLED (0x80000000 = 2147483648).

(groupType:1.2.840.113556.1.4.803:=2147483648))

OctetString

Wartość określona w filtrze to znalezione dane. Dane muszą być reprezentowane jako ciąg bajtów, gdzie każdy bajt jest zakodowany jako dwa znaki, a poprzedzony jest ukośnikiem odwrotnym (\). Na przykład wartość 0x05 pojawi się w ciągu jako "\05".

Funkcja ADsEncodeBinaryData może służyć do tworzenia zakodowanej reprezentacji ciągu danych binarnych. Funkcja ADsEncodeBinaryData nie koduje wartości bajtów reprezentujących znaki alfanumeryczne. Zamiast tego umieści znak w ciągu bez kodowania. Spowoduje to utworzenie ciągu zawierającego kombinację zakodowanych i niekodowanych znaków. Jeśli na przykład dane binarne są 0x05|0x1A|0x1B|0x43|0x32, zakodowany ciąg będzie zawierać ciąg "\05\1A\1BC2". Nie ma to wpływu na filtr, a filtry wyszukiwania będą działać poprawnie z tymi typami ciągów.

Symbole wieloznaczne są akceptowane.

Poniższy przykład kodu przedstawia filtr zawierający zakodowany ciąg dla schemaIDGUID z wartością GUID "{BF967ABA-0DE6-11D0-A285-00A00303049E2}":

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

Sid

Wartość określona w filtrze jest zakodowaną reprezentacją ciągu bajtowego identyfikatora SID. Aby uzyskać więcej informacji na temat zakodowanych ciągów bajtów, zobacz poprzednią sekcję w tym temacie, w której omówiono składnię OctetString.

Poniższy przykład kodu przedstawia filtr zawierający zakodowany ciąg dla objectSid z wartością ciągu 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

Należy podać całą nazwę wyróżniającą, aby można było ją dopasować.

Symbole wieloznaczne nie są akceptowane.

Należy pamiętać, że atrybut objectCategory umożliwia również określenie lDAPDisplayName klasy ustawionej na atrybucie.

Poniższy przykład pokazuje filtr określający element zawierający "CN=TestUser,DC=Fabrikam,DC=COM".

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

CAŁKOWITA8

Wartość określona w filtrze musi być liczbą całkowitą dziesiętną. Przekonwertuj wartości szesnastkowe na dziesiętne.

Poniższy przykład kodu przedstawia filtr określający creationTime ustawiony na FILETIME "1999-12-31 23:59:59 (UTC/GMT)":

(creationTime=125911583990000000)

Następujące funkcje tworzą dokładny filtr dopasowania (=) dla atrybutu liczby całkowitej i weryfikują atrybut w schemacie oraz jego składnię.

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

Atrybuty z tymi składniami powinny być zgodne z określonymi zestawami znaków. Aby dowiedzieć się więcej, zobacz Składnie atrybutów w usługach domenowych Active Directory.

Obecnie usługi Active Directory Domain Services nie wymuszają tych zestawów znaków.

Wartość określona w filtrze jest ciągiem. Porównanie uwzględnia wielkość liter.

UogólnionyCzas

Wartość określona w filtrze jest ciągiem reprezentującym datę w następującym formularzu:

YYYYMMDDHHMMSS.0Z

Wartość "0Z" nie wskazuje różnicy czasu. Należy pamiętać, że serwer usługi Active Directory przechowuje datę/godzinę jako Czas średni Greenwich (GMT). Jeśli nie określono różnicy czasu, wartość domyślna to GMT.

Jeśli lokalna strefa czasowa nie jest GMT, użyj wartości różnicowej, aby określić lokalną strefę czasową i zastosować różnicową do GMT. Różnica czasu jest obliczana na podstawie wzoru: GMT = lokalny czas + różnica.

Aby określić różnicę, użyj:

YYYYMMDDHHMMSS.0[+/-]HHMM

W poniższym przykładzie pokazano filtr określający , który ustawia czas utworzenia na 23.03.99 20:52:58 GMT:

(whenCreated=19990323205258.0Z)

W poniższym przykładzie pokazano filtr, który określa z czasem utworzenia ustawionym na 23.03.99 20:52:58 Nowa Zelandia Czas Standardowy (różnica wynosi +12 godzin):

(whenCreated=19990323205258.0+1200)

Poniższy przykład kodu przedstawia sposób obliczania różnicowej strefy czasowej. Funkcja zwraca różnicę między bieżącą lokalną strefą czasową a GMT. Zwrócona wartość jest ciągiem w następującym formacie:

[+/-]HHMM

Na przykład standardowy czas pacyficzny to -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;
}

czas UTC

Wartość określona w filtrze jest ciągiem reprezentującym datę w następującym formularzu:

YYMMDDHHMMSSZ

Z nie wskazuje różnicy czasu. Należy pamiętać, że serwer usługi Active Directory przechowuje datę i godzinę jako czas GMT. Jeśli nie określono różnicy czasu, gmt jest wartością domyślną.

Wartość sekund ("SS") jest opcjonalna.

Jeśli GMT nie jest lokalną strefą czasową, zastosuj lokalną wartość różnicową, aby określić lokalną strefę czasową. Różnica wynosi: GMT=Czas lokalny+różnica.

Aby wyznaczyć różnicę, użyj następującej formy:

YYMMDDHHMMSS[+/-]HHMM

W poniższym przykładzie przedstawiono filtr określający atrybut czasu myTimeAttrib ustawiony na 23.03.1999 20:52:58 GMT:

(myTimeAttrib=990323205258Z)

W poniższym przykładzie przedstawiono filtr określający myTimeAttrib z czasem ustawionym na 23.03.99 20:52:58 bez uwzględniania sekund.

(myTimeAttrib=9903232052Z)

W poniższym przykładzie pokazano filtr, który określa myTimeAttrib czas ustawiony na 23/03/1999, 20:52:58 Czas standardowy Nowej Zelandii (różnica wynosi 12 godzin). Jest to odpowiednik 3/23/99 8:52:58 CZASU GMT.

(myTimeAttrib=990323205258+1200)

DirectoryString

Wartość określona w filtrze jest ciągiem. DirectoryString może zawierać znaki Unicode. Porównanie jest bez uwzględniania wielkości liter.

OID

Aby dopasować, należy podać cały OID.

Symbole wieloznaczne nie są akceptowane.

Atrybut objectCategory umożliwia określenie lDAPDisplayName zestawu klas dla atrybutu.

W poniższym przykładzie przedstawiono filtr określający, że kontroluje identyfikator dla klasy woluminu.

(governsID=1.2.840.113556.1.5.36)

Dwa równoważne filtry określające systemMustContain atrybut zawierający uNCName, który ma identyfikator OID 1.2.840.113556.1.4.137:

(SystemMustContain=uNCName)
 
(SystemMustContain=1.2.840.113556.1.4.137)

Inne składnie

Następujące składnie są oceniane w filtrze podobnym do ciągu oktetu:

  • DeskryptorZabezpieczeńObiektu
  • AccessPointDN
  • AdresyPrezentacji
  • ReplicaLink
  • DNWithString
  • DNWithOctetString
  • ORName