Provedení dotazu na obor atributů
Dotaz na obor atributů je vyhledávací preference, která umožňuje provádět vyhledávání atributů s rozlišujícími názvy objektu. Atribut pro vyhledávání může být buď jeden, nebo vícehodnotový, ale musí být typu ADS_DN_STRING. Při provádění hledání vytvoří rozhraní ADSI výčet rozlišujících hodnot názvů atributu a provede vyhledávání objektů reprezentovaných rozlišujínými názvy. Pokud je například provedeno vyhledávání omezené na atribut člen objektu skupiny, rozhraní ADSI vyčíslí rozlišující názvy v atributu člen a vyhledá mezi členy skupiny podle zadaných kritérií hledání.
Pokud se u atributu, který není typu ADS_DN_STRING, provede dotaz s vymezeným atributem, hledání selže. Dotaz s vymezeným atributem také vyžaduje, aby byla předvolba ADS_SEARCHPREF_SEARCH_SCOPE nastavena na ADS_SCOPE_BASE. Předvolba ADS_SEARCHPREF_SEARCH_SCOPE se automaticky nastaví na ADS_SCOPE_BASE, ale pokud je předvolba ADS_SEARCHPREF_SEARCH_SCOPE nastavena na jinou hodnotu, IDirectorySearch::SetSearchPreference selže s E_ADS_BAD_PARAMETER.
Výsledky dotazu v oboru atributů můžou zahrnovat více serverů a server nemusí vrátit všechna data požadovaná pro všechny vrácené řádky. Pokud k tomu dojde, když je poslední řádek načten voláním IDirectorySearch::GetNextRow nebo IDirectorySearch::GetFirstRow, ADSI vrátí S_ADS_ERRORSOCCURRED místo S_ADS_NOMORE_ROWS.
Pokud chcete zadat dotaz na rozsah atributu, nastavte vyhledávací možnost ADS_SEARCHPREF_ATTRIBUTE_QUERY s hodnotou ADSTYPE_CASE_IGNORE_STRING, která je nastavena na lDAPDisplayName atributu, který má být vyhledán, v poli zadaném ADS_SEARCHPREF_INFO, předávaném metodě IDirectorySearch::SetSearchPreference. Tato operace je zobrazena v následujícím příkladu kódu.
ADS_SEARCHPREF_INFO SearchPref;
SearchPref.dwSearchPref = ADS_SEARCHPREF_ATTRIBUTE_QUERY;
SearchPref.vValue.dwType = ADSTYPE_CASE_IGNORE_STRING;
SearchPref.vValue.Boolean = L"member";
Následující příklad kódu ukazuje, jak použít ADS_SEARCHPREF_ATTRIBUTE_QUERY vyhledávací možnost.
/***************************************************************************
SearchGroupMembers()
Searches the members of a group that are of type user and prints each
user's cn and distinguishedName values to the console.
Parameters:
pwszGroupDN - Contains the distinguished name of the group whose
members will be searched.
***************************************************************************/
HRESULT SearchGroupMembers(LPCWSTR pwszGroupDN)
{
HRESULT hr;
CComPtr<IDirectorySearch> spSearch;
CComBSTR sbstrADsPath;
// Bind to the group and get the IDirectorySearch interface.
sbstrADsPath = "LDAP://";
sbstrADsPath += pwszGroupDN;
hr = ADsOpenObject(sbstrADsPath,
NULL,
NULL,
ADS_SECURE_AUTHENTICATION,
IID_IDirectorySearch,
(void**)&spSearch);
if(FAILED(hr))
{
return hr;
}
ADS_SEARCHPREF_INFO SearchPrefs[1];
// Set the ADS_SEARCHPREF_ATTRIBUTE_QUERY search preference.
SearchPrefs[0].dwSearchPref = ADS_SEARCHPREF_ATTRIBUTE_QUERY;
SearchPrefs[0].vValue.dwType = ADSTYPE_CASE_IGNORE_STRING;
SearchPrefs[0].vValue.CaseIgnoreString = L"member";
// Set the search preferences.
hr = spSearch->SetSearchPreference(SearchPrefs, sizeof(SearchPrefs)/sizeof(ADS_SEARCHPREF_INFO));
if(FAILED(hr))
{
return hr;
}
ADS_SEARCH_HANDLE hSearch;
// Create the search filter.
LPWSTR pwszSearchFilter = L"(&(objectClass=user))";
// Set attributes to return.
LPWSTR rgpwszAttributes[] = {L"cn", L"distinguishedName"};
DWORD dwNumAttributes = sizeof(rgpwszAttributes)/sizeof(LPWSTR);
// Execute the search.
hr = spSearch->ExecuteSearch(pwszSearchFilter,
rgpwszAttributes,
dwNumAttributes,
&hSearch);
if(FAILED(hr))
{
return hr;
}
// Get the first result row.
hr = spSearch->GetFirstRow(hSearch);
while(S_OK == hr)
{
ADS_SEARCH_COLUMN col;
// Enumerate the retrieved attributes.
for(DWORD i = 0; i < dwNumAttributes; i++)
{
hr = spSearch->GetColumn(hSearch, rgpwszAttributes[i], &col);
if(SUCCEEDED(hr))
{
switch(col.dwADsType)
{
case ADSTYPE_DN_STRING:
wprintf(L"%s: %s\n\n", rgpwszAttributes[i], col.pADsValues[0].DNString);
break;
case ADSTYPE_CASE_IGNORE_STRING:
wprintf(L"%s: %s\n\n", rgpwszAttributes[i], col.pADsValues[0].CaseExactString);
break;
default:
break;
}
// Free the column.
spSearch->FreeColumn(&col);
}
}
// Get the next row.
hr = spSearch->GetNextRow(hSearch);
}
// Close the search handle to cleanup.
hr = spSearch->CloseSearchHandle(hSearch);
return hr;
}
Při spuštění tohoto hledání a když jsou výsledky vyčísleny, vrátí název, telefonní čísloa číslo kanceláře všech uživatelských objektů obsažených v seznamu atributů člena skupiny.
Zpracování chyb: Výsledky dotazu v oboru atributů můžou zahrnovat více serverů a server nemusí vrátit všechna data požadovaná pro všechny vrácené řádky. Pokud k tomu dojde, když je poslední řádek načten voláním GetNextRow nebo GetFirstRow, ADSI vrátí S_ADS_ERRORSOCCURREDmísto S_ADS_NOMORE_ROWS.