Zugreifen auf Attribute mit der IDirectoryObject-Schnittstelle
Die IDirectoryObject-Schnittstelle bietet einer in C und C++ geschriebenen Clientanwendung direkten Zugriff auf Verzeichnisdienstobjekte. Die Schnittstelle ermöglicht den Zugriff über ein direktes Netzwerkprotokoll und nicht über den ADSI-Attributcache. Anstelle der von der IADs-Schnittstelle unterstützten Eigenschaften stellt IDirectoryObject Methoden bereit, die eine kritische Teilmenge der Wartungsmethoden eines Objekts unterstützen und Zugriff auf seine Attribute bieten. Mit IDirectoryObject kann ein Client eine beliebige Anzahl von Objektattributen mit einem Methodenaufruf abrufen oder festlegen. Im Gegensatz zu den entsprechenden Automation-Methoden, die batched werden, werden diejenigen von IDirectoryObject ausgeführt, wenn sie aufgerufen werden. Da für Methoden auf dieser Schnittstelle keine instance eines Automation-Verzeichnisobjekts erstellt werden muss, ist der Leistungsaufwand gering.
Clients, die in Sprachen wie C und C++ geschrieben wurden, sollten die Methoden der IDirectoryObject-Schnittstelle verwenden, um die Leistung zu optimieren und native Verzeichnisdienstschnittstellen zu nutzen. Automation-Clients können IDirectoryObject nicht verwenden. Stattdessen sollten sie die IADs-Schnittstelle verwenden.
Die IDirectoryObject::GetObjectAttributes-Methode ruft Attribute mit einem und mehreren Werten ab. Diese Methode akzeptiert eine Liste der angeforderten Attribute und gibt eine ADS_ATTR_INFO-Struktur zurück. AdsI ordnet diese Struktur zu; Der Aufrufer muss diesen Arbeitsspeicher freigeben, wenn er nicht mehr über die FreeADsMem-Funktion benötigt wird.
Die Reihenfolge der zurückgegebenen Attributwerte entspricht nicht unbedingt der Reihenfolge, in der die Attribute angefordert wurden. Daher ist es notwendig, die von ADSI zurückgegebenen Attributnamen zu vergleichen.
Hinweis
Die ADS_ATTR_INFO-Struktur gibt nicht alle angeforderten Attribute zurück. Nur die Attribute, die Werte enthalten, sind Teil der zurückgegebenen Struktur.
Die Anzahl der zurückgegebenen Attribute wird durch den dwNumberAttributes-Parameter bestimmt, der an die IDirectoryObject::GetObjectAttributes-Methode übergeben wird.
Im folgenden Codebeispiel wird eine Bindung an ein Objekt hergestellt und die IDirectoryObject::GetObjectAttributes-Methode verwendet, um Attribute des Objekts abzurufen.
HRESULT hr;
IDirectoryObject *pDirObject;
CoInitialize(NULL);
hr = ADsGetObject(
L"LDAP://CN=Jeff Smith,OU=Users,DC=Fabrikam,DC=com",
IID_IDirectoryObject,
(void**)&pDirObject);
if(SUCCEEDED(hr))
{
ADS_ATTR_INFO *pAttrInfo = NULL;
LPWSTR pAttrNames[] = {L"cn", L"title", L"otherTelephone"};
DWORD dwNumAttr = sizeof(pAttrNames)/sizeof(LPWSTR);
DWORD dwReturn;
//////////////////////////////////////////////////
// Get attribute values requested.
// Be aware that the order is not necessarily the
// same as requested using pAttrNames.
//////////////////////////////////////////////////
hr = pDirObject->GetObjectAttributes(pAttrNames,
dwNumAttr,
&pAttrInfo,
&dwReturn);
if(SUCCEEDED(hr))
{
for(DWORD idx = 0; idx < dwReturn; idx++)
{
if(_wcsicmp(pAttrInfo[idx].pszAttrName, L"cn") == 0)
{
if(pAttrInfo[idx].dwADsType == ADSTYPE_CASE_IGNORE_STRING)
{
wprintf(L"Common Name: %s\n",
pAttrInfo[idx].pADsValues[0].CaseIgnoreString);
}
}
else if(_wcsicmp(pAttrInfo[idx].pszAttrName, L"title") == 0)
{
if(pAttrInfo->dwADsType == ADSTYPE_CASE_IGNORE_STRING)
{
wprintf(L"Title: %s\n",
pAttrInfo[idx].pADsValues[0].CaseIgnoreString);
}
}
else if(_wcsicmp(pAttrInfo[idx].pszAttrName,
L"otherTelephone") == 0)
{
// Print the multi-valued property, "Other Telephones".
if(pAttrInfo[idx].dwADsType == ADSTYPE_CASE_IGNORE_STRING)
{
wprintf(L"Other Telephones:");
for(DWORD val = 0; val < pAttrInfo[idx].dwNumValues; val++)
{
wprintf(L" %s\n",
pAttrInfo[idx].pADsValues[val].CaseIgnoreString);
}
}
}
}
FreeADsMem(pAttrInfo);
}
pDirObject->Release();
}
CoUninitialize();