Share via


Acessando atributos com a interface IDirectoryObject

A interface IDirectoryObject fornece um aplicativo cliente escrito em C e C++ com acesso direto a objetos de serviço de diretório. A interface permite o acesso por meio de um protocolo de rede direto, em vez de através do cache de atributos ADSI. No lugar das propriedades suportadas pela interface IADs , IDirectoryObject fornece métodos que oferecem suporte a um subconjunto crítico dos métodos de manutenção de um objeto e fornecem acesso a seus atributos. Com IDirectoryObject, um cliente pode obter ou definir qualquer número de atributos de objeto com uma chamada de método. Ao contrário dos métodos de automação correspondentes, que são em lote, os de IDirectoryObject são executados quando chamados. Como os métodos nessa interface não exigem a criação de uma instância de um objeto de diretório de automação, a sobrecarga de desempenho é pequena.

Os clientes escritos em linguagens como C e C++ devem usar os métodos da interface IDirectoryObject para otimizar o desempenho e aproveitar as interfaces nativas do serviço de diretório. Os clientes de automação não podem usar IDirectoryObject. Em vez disso, eles devem usar a interface IADs.

O método IDirectoryObject::GetObjectAttributes recupera atributos com valores únicos e múltiplos. Esse método usa uma lista de atributos solicitados e retorna uma estrutura ADS_ATTR_INFO. A ADSI aloca essa estrutura; o chamador deve liberar essa memória quando ela não for mais necessária usando a função FreeADsMem .

A ordem dos valores de atributo retornados não é necessariamente a mesma em que os atributos foram solicitados. Portanto, é necessário comparar os nomes de atributos retornados do ADSI.

Observação

A estrutura ADS_ATTR_INFO não retorna todos os atributos solicitados. Somente os atributos que contêm valores fazem parte da estrutura retornada.

 

O número de atributos retornados é determinado pelo parâmetro dwNumberAttributes passado para o método IDirectoryObject::GetObjectAttributes.

O exemplo de código a seguir se vincula a um objeto e usa o IDirectoryObject::GetObjectAttributes método para recuperar atributos do objeto.

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