如何指定比較值
每個屬性類型都有一個語法,可決定您可以在該屬性的搜尋篩選中指定的比較值類型。
下列各節說明每個屬性語法的需求。 如需屬性語法的詳細資訊,請參閱 Active Directory 網域服務 中的屬性語法。
-
布爾
-
篩選中指定的值必須是 「TRUE」 或 「FALSE」 的字串值。 下列範例示範如何指定布爾比較字串。
下列範例會搜尋 showInAdvancedViewOnly 設定為 TRUE 的物件:
(showInAdvancedViewOnly=TRUE)
下列範例會搜尋 showInAdvancedViewOnly 設定為 FALSE 的物件:
(showInAdvancedViewOnly=FALSE)
-
整數和列舉
-
篩選中指定的值必須是十進位整數。 十六進位值必須轉換成十進位。 值比較字串的格式如下:
<attribute name>:<value>
“<attribute name>” 是 屬性的 lDAPDisplayName ,而 “<value>” 是用於比較的值。
下列程式代碼範例顯示篩選條件,其會搜尋 groupType 值等於 ADS_GROUP_TYPE_UNIVERSAL_GROUP (8) 旗標和ADS_GROUP_TYPE_SECURITY_ENABLED (0x80000000) 旗標的物件。 兩個旗標合併為相等0x80000008,轉換成十進位的旗標是2147483656。
(groupType=2147483656)
LDAP 比對規則運算符也可以用來執行位比較。 如需比對規則的詳細資訊,請參閱 搜尋篩選語法。 下列程式代碼範例顯示篩選條件,其會搜尋具有 groupType 且具有 ADS_GROUP_TYPE_SECURITY_ENABLED (0x80000000 = 2147483648) 位集的物件。
(groupType:1.2.840.113556.1.4.803:=2147483648))
-
OctetString
-
篩選中指定的值是要找到的數據。 數據必須以兩個字元編碼的位元組位元串表示,其中每個位元組前面都有反斜杠 (\)。 例如,0x05的值會顯示在字串中為 “\05”。
ADsEncodeBinaryData 函式可用來建立二進位數據的編碼字串表示。 ADsEncodeBinaryData 函式不會編碼代表英數位元的位元元組值。 相反地,它會將字元放入字串中,而不需編碼。 這會導致字串包含編碼和未編碼字元的混合。 例如,如果二進位數據是0x05|0x1A|0x1B|0x43|0x32,則編碼的字串將包含 “\05\1A\1BC2”。 這不會影響篩選條件,而且搜尋篩選條件會使用這些類型的字串正確運作。
接受通配符。
下列程式代碼範例顯示包含 schemaIDGUID 編碼字串 的篩選,其 GUID 值為 “{BF967ABA-0DE6-11D0-A285-00AA003049E2}”:
(schemaidguid=\BA\7A\96\BF\E6\0D\D0\11\A2\85\00\AA\00\30\49\E2)
-
希
-
篩選中指定的值是 SID 的編碼位元組字串表示。 如需編碼位元組位元元串的詳細資訊,請參閱本主題中的上一節,討論 OctetString 語法。
下列程式代碼範例顯示包含 objectSid 編碼字串串的篩選,其 SID 字串值為 “S-1-5-21-1935655697-308236825-1417001333”:
(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
-
篩選中指定的值必須是十進位整數。 將十六進位值轉換成十進位。
下列程式代碼範例顯示篩選,指定 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 PM GMT 時:
(whenCreated=19990323205258.0Z)
下列範例顯示篩選條件,指定 當建立 時間設定為 3/23/99 下午 8:52:58 紐西蘭標準時間 (差異為 +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=Local+differential。
若要指定差異,請使用下列格式:
YYMMDDHHMMSS[+/-]HHMM
下列範例顯示指定 myTimeAttrib 時間設定為 3/23/99 8:52:58 GMT 的篩選條件:
(myTimeAttrib=990323205258Z)
下列範例顯示指定 myTimeAttrib 時間設定為 3/23/99 8:52:58 PM 且未指定秒的篩選條件:
(myTimeAttrib=9903232052Z)
下列範例顯示一個篩選,指定 myTimeAttrib 時間設定為 3/23/99 下午 8:52:58 紐西蘭標準時間(差異為 12 小時)。 這相當於格林尼治時間上午 3/23/99 8:52:58。
(myTimeAttrib=990323205258+1200)
-
DirectoryString
-
篩選中指定的值是字串。 DirectoryString 可以包含 Unicode 字元。 此比較不區分大小寫。
-
老
-
必須提供要比對的整個 OID。
不接受通配符。
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