Ausführen einer Attributbereichsabfrage
Die Attributbereichsabfrage ist eine Sucheinstellung, mit der eine Suche nach den Distinguished Name Valued Attributen eines Objekts durchgeführt werden kann. Das zu suchende Attribut kann entweder ein- oder mehrwertig sein, muss jedoch vom ADS _ DN _ STRING-Typ sein. Wenn die Suche ausgeführt wird, zählt ADSI die Distinguished Name-Werte des Attributs auf und führt die Suche für die durch die Distinguished Names dargestellten Objekte aus. Wenn beispielsweise eine Attributbereichssuche des Elementattributs eines Gruppenobjekts ausgeführt wird, zählt ADSI die Distinguished Names im Memberattribut auf und durchsucht alle Elemente der Gruppe nach den angegebenen Suchkriterien.
Wenn eine Attributbereichsabfrage für ein Attribut ausgeführt wird, das nicht vom Typ ADS _ DN _ STRING ist, schlägt die Suche fehl. Die Attributbereichsabfrage erfordert auch, dass die ADS _ SEARCHPREF _ SEARCH _ SCOPE SCOPE-Einstellung auf ADS SCOPE _ _ BASE festgelegt wird. Die _ SEARCHPREF SEARCH _ _ SCOPE-Einstellung von ADS wird automatisch auf ADS SCOPE _ _ BASE festgelegt, aber wenn die _ SEARCHPREF _ SEARCH _ SCOPE-Einstellung von ADS auf einen anderen Wert festgelegt ist, schlägt IDirectorySearch::SetSearchPreference mit E ADS BAD _ _ _ PARAMETER fehl.
Die Ergebnisse einer Attributbereichsabfrage können mehrere Server umfassen, und ein Server gibt möglicherweise nicht alle angeforderten Daten für alle zurückgegebenen Zeilen zurück. In diesem Fall gibt ADSI beim Abrufen der letzten Zeile durch Aufrufen von IDirectorySearch::GetNextRow oder IDirectorySearch::GetFirstRow S ADS _ _ ERRORSOCCURRED anstelle von S ADS _ _ NOMORE _ ROWS zurück.
Um eine Attributbereichsabfrage anzugeben, legen Sie eine ADS _ SEARCHPREF _ ATTRIBUTE _ QUERY-Suchoption mit einem ADSTYPE CASE IGNORE _ _ _ STRING-Wert fest, der auf den lDAPDisplayName des Attributs festgelegt ist, das im ADS _ SEARCHPREF _ INFO-Array durchsucht werden soll, das an die IDirectorySearch::SetSearchPreference-Methode übergeben wird. Dieser Vorgang wird im folgenden Codebeispiel gezeigt.
ADS_SEARCHPREF_INFO SearchPref;
SearchPref.dwSearchPref = ADS_SEARCHPREF_ATTRIBUTE_QUERY;
SearchPref.vValue.dwType = ADSTYPE_CASE_IGNORE_STRING;
SearchPref.vValue.Boolean = L"member";
Im folgenden Codebeispiel wird die Verwendung der Suchoption ADS _ SEARCHPREF _ ATTRIBUTE _ QUERY veranschaulicht.
/***************************************************************************
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;
}
Wenn diese Suche ausgeführt wird und die Ergebnisse aufgezählt werden, werden der Name, die Telefonnummer und die Büronummer aller Benutzerobjekte zurückgegeben, die in der Elementattributliste der Gruppe enthalten sind.
Fehlerbehandlung: Die Ergebnisse einer Attributbereichsabfrage können mehrere Server umfassen, und ein Server gibt möglicherweise nicht alle Daten zurück, die für alle zurückgegebenen Zeilen angefordert wurden. In diesem Fall gibt ADSI beim Abrufen der letzten Zeile durch Aufrufen von GetNextRow oder GetFirstRow S ADS _ _ ERRORSOCCURRED anstelle von S ADS _ _ NOMORE _ ROWS zurück.