Accès aux attributs avec l’interface IDirectoryObject
L’interface IDirectoryObject fournit une application cliente écrite en C et C++ avec un accès direct aux objets de service d’annuaire. L’interface active l’accès au moyen d’un protocole réseau direct, plutôt que par le biais du cache d’attributs ADSI. À la place des propriétés prises en charge par l’interface IADs , IDirectoryObject fournit des méthodes qui prennent en charge un sous-ensemble critique des méthodes de maintenance d’un objet et fournissent l’accès à ses attributs. Avec IDirectoryObject, un client peut obtenir ou définir un nombre quelconque d’attributs d’objet avec un seul appel de méthode. Contrairement aux méthodes Automation correspondantes, qui sont traitées par lots, celles d’IDirectoryObject sont exécutées lorsqu’elles sont appelées. Étant donné que les méthodes de cette interface ne nécessitent pas la création d’un instance d’un objet de répertoire Automation, la surcharge de performances est faible.
Les clients écrits dans des langages tels que C et C++ doivent utiliser les méthodes de l’interface IDirectoryObject pour optimiser les performances et tirer parti des interfaces de service d’annuaire natives. Les clients Automation ne peuvent pas utiliser IDirectoryObject. Au lieu de cela, ils doivent utiliser l’interface IADs .
La méthode IDirectoryObject::GetObjectAttributes récupère les attributs avec des valeurs uniques et multiples. Cette méthode prend une liste d’attributs demandés et retourne une structure ADS_ATTR_INFO . ADSI alloue cette structure ; l’appelant doit libérer cette mémoire lorsqu’elle n’est plus nécessaire à l’aide de la fonction FreeADsMem .
L’ordre des valeurs d’attribut retournées n’est pas nécessairement le même que l’ordre dans lequel les attributs ont été demandés. Par conséquent, il est nécessaire de comparer les noms d’attributs retournés par ADSI.
Notes
La structure ADS_ATTR_INFO ne retourne pas tous les attributs demandés. Seuls les attributs qui contiennent des valeurs font partie de la structure retournée.
Le nombre d’attributs retournés est déterminé par le paramètre dwNumberAttributes passé à la méthode IDirectoryObject::GetObjectAttributes .
L’exemple de code suivant lie à un objet et utilise la méthode IDirectoryObject::GetObjectAttributes pour récupérer les attributs de l’objet.
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();