Condividi tramite


Accesso agli attributi con l'interfaccia IDirectoryObject

L'interfaccia IDirectoryObject fornisce un'applicazione client scritta in C e C++ con accesso diretto agli oggetti del servizio directory. L'interfaccia consente l'accesso tramite un protocollo di rete diretta, anziché tramite la cache degli attributi ADSI. Al posto delle proprietà supportate dall'interfaccia IADs , IDirectoryObject fornisce metodi che supportano un subset critico dei metodi di manutenzione di un oggetto e forniscono l'accesso ai relativi attributi. Con IDirectoryObject, un client può ottenere o impostare un numero qualsiasi di attributi oggetto con una chiamata al metodo. A differenza dei metodi di automazione corrispondenti, in batch, quelli di IDirectoryObject vengono eseguiti quando viene chiamato. Poiché i metodi in questa interfaccia non richiedono la creazione di un'istanza di un oggetto directory di Automazione, il sovraccarico delle prestazioni è ridotto.

I client scritti in linguaggi come C e C++ devono usare i metodi dell'interfaccia IDirectoryObject per ottimizzare le prestazioni e sfruttare le interfacce native del servizio directory. I client di automazione non possono usare IDirectoryObject. Devono invece usare l'interfaccia IAD .

Il metodo IDirectoryObject::GetObjectAttributes recupera gli attributi con valori singoli e multipli. Questo metodo accetta un elenco di attributi richiesti e restituisce una struttura ADS_ATTR_INFO. ADSI alloca questa struttura; Il chiamante deve liberare questa memoria quando non è più necessaria usando la funzione FreeADsMem.

L'ordine dei valori degli attributi restituiti non corrisponde necessariamente all'ordine in cui sono stati richiesti gli attributi. Pertanto, è necessario confrontare i nomi degli attributi restituiti da ADSI.

Nota

La struttura ADS_ATTR_INFO non restituisce tutti gli attributi richiesti. Solo gli attributi che contengono valori fanno parte della struttura restituita.

 

Il numero di attributi restituiti è determinato dal parametro dwNumberAttributes passato al metodo IDirectoryObject::GetObjectAttributes .

Nell'esempio di codice seguente viene associato a un oggetto e viene utilizzato il metodo IDirectoryObject::GetObjectAttributes per recuperare gli attributi dell'oggetto.

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();