如何指定比较值

每个属性类型都有一个语法,用于确定可以在该属性的搜索筛选器中指定的比较值的类型。

以下各节介绍每个属性语法的要求。 有关属性语法的详细信息,请参阅Active Directory 域服务中属性的语法。

布尔

筛选器中指定的值必须是“TRUE”或“FAL标准版”的字符串值。 以下示例演示如何指定布尔比较字符串。

以下示例将搜索 showInAdvancedViewOnly 设置为 TRUE 的对象:

(showInAdvancedViewOnly=TRUE)

以下示例将搜索 showInAdvancedViewOnly 设置为 FAL 的对象标准版

(showInAdvancedViewOnly=FALSE)

整数和枚举

筛选器中指定的值必须是十进制整数。 必须将十六进制值转换为十进制值。 值比较字符串采用以下形式:

<attribute name>:<value>

“<attribute name>”是 特性的 lDAPDisplayName ,“<value>”是用于比较的值。

下面的代码示例显示了一个筛选器,该筛选器将搜索一个 groupType 值等于 ADS_GROUP_TYPE_UNIVERSAL_GROUP (8) 标志和ADS_GROUP_TYPE_标准版CURITY_ENABLED (0x80000000) 标志的对象。 两个标志组合为相等0x80000008,转换为十进制2147483656。

(groupType=2147483656)

LDAP 匹配规则运算符还可用于执行按位比较。 有关匹配规则的详细信息,请参阅 搜索筛选器语法。 下面的代码示例显示了一个筛选器,该筛选器将搜索具有具有 ADS_GROUP_TYPE_标准版CURITY_ENABLED (0x80000000 = 2147483648) 位集的 groupType 的对象。

(groupType:1.2.840.113556.1.4.803:=2147483648))

OctetString

筛选器中指定的值是要找到的数据。 数据必须表示为两个字符编码的字节字符串,其中每个字节前面有一个反斜杠(\)。 例如,0x05的值将显示在字符串中为“\05”。

ADsEncodeBinaryData 函数可用于创建二进制数据的编码字符串表示形式。 ADsEncodeBinaryData 函数不对表示 alpha 数字字符的字节值进行编码。 相反,它会将字符放入字符串中,而无需对其进行编码。 这会导致包含已编码字符和未编码字符混合的字符串。 例如,如果二进制数据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

必须提供要匹配的整个可分辨名称。

不接受 Wild卡。

请注意, objectCategory 属性还允许指定 特性上设置的类的 lDAPDisplayName

以下示例显示了一个 筛选器,该筛选器指定包含“CN=TestUser,DC=Fabrikam,DC=COM”的成员

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

INTEGER8

筛选器中指定的值必须是十进制整数。 将十六进制值转换为十进制值。

下面的代码示例显示了一个筛选器,该筛选器指定将 creationTime 设置为“1999-12-31 23:59:59(UTC/GMT)”的 FILETIME

(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 域服务 中属性的语法。

目前,Active Directory 域服务不强制实施这些字符集。

筛选器中指定的值是字符串。 比较是区分大小写的。

GeneralizedTime

筛选器中指定的值是一个字符串,表示以下形式的日期:

YYYYMMDDHHMMSS.0Z

“0Z”表示没有时间差异。 请注意,Active Directory 服务器将日期/时间存储为格林威治平均时间(GMT)。 如果未指定时间差异,则默认值为 GMT。

如果本地时区不是 GMT,请使用差异值指定本地时区并将差异应用于 GMT。 差异基于:GMT=Local+differential。

若要指定差异,请使用:

YYYYMMDDHHMMSS.0[+/-]HHMM

以下示例显示了一个筛选器,该 筛选器指定设置为 3/23/99 下午 8:52:58 的 TimeCreated 时间:

(whenCreated=19990323205258.0Z)

以下示例演示了一个筛选器,该筛选器指定设置为 3/23/99 下午 8:52:58(差异为 +12 小时):3/23/99 下午 8:52:58:

(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=Local+differential。

若要指定差异,请使用以下形式:

YYMMDDHHMMSS[+/-]HHMM

以下示例显示了一个筛选器,该 筛选器指定设置为 3/23/99 下午 8:52:58 的 myTimeAttrib 时间:

(myTimeAttrib=990323205258Z)

以下示例显示了一个筛选器,该 筛选器指定设置为 3/23/99 8:52:58 PM 且未指定秒的 myTimeAttrib 时间:

(myTimeAttrib=9903232052Z)

以下示例显示了一个筛选器,该 筛选器指定设置为 3/23/99 下午 8:52:58 的 myTimeAttrib 时间(差异为 12 小时)。 这相当于格林尼治标准时间上午 3/23/8:52:58。

(myTimeAttrib=990323205258+1200)

DirectoryString

筛选器中指定的值是字符串。 DirectoryString 可以包含 Unicode 字符。 比较不区分大小写。

必须提供要匹配的整个 OID。

不接受 Wild卡。

通过 objectCategory 属性,可以指定 特性的类集的 lDAPDisplayName

以下示例显示了一个筛选器,该筛选器指定 卷类的 governsID

(governsID=1.2.840.113556.1.5.36)

两个等效筛选器,用于指定包含 uNCName 的 systemMustContain 属性,其 OID 为 1.2.840.113556.1.4.137:

(SystemMustContain=uNCName)
 
(SystemMustContain=1.2.840.113556.1.4.137)

其他语法

以下语法在类似于八进制字符串的筛选器中计算:

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