Compartir a través de


Obtener acceso a atributos con la interfaz IDirectoryObject

La interfaz IDirectoryObject proporciona una aplicación cliente escrita en C y C++ con acceso directo a objetos de servicio de directorio. La interfaz permite el acceso mediante un protocolo de red directo, en lugar de a través de la caché de atributos ADSI. En lugar de las propiedades admitidas por la interfaz iaDs , IDirectoryObject proporciona métodos que admiten un subconjunto crítico de los métodos de mantenimiento de un objeto y proporcionan acceso a sus atributos. Con IDirectoryObject, un cliente puede obtener o establecer cualquier número de atributos de objeto con una llamada de método. A diferencia de los métodos de Automatización correspondientes, que se procesan por lotes, los de IDirectoryObject se ejecutan cuando se llama a . Dado que los métodos de esta interfaz no requieren la creación de una instancia de un objeto de directorio de Automation, la sobrecarga de rendimiento es pequeña.

Los clientes escritos en lenguajes como C y C++ deben usar los métodos de la interfaz IDirectoryObject para optimizar el rendimiento y aprovechar las interfaces de servicio de directorio nativas. Los clientes de Automation no pueden usar IDirectoryObject. En su lugar, deben usar la interfaz iaDs .

El método IDirectoryObject::GetObjectAttributes recupera atributos con valores únicos y múltiples. Este método toma una lista de atributos solicitados y devuelve una estructura ADS_ATTR_INFO . ADSI asigna esta estructura; el autor de la llamada debe liberar esta memoria cuando ya no sea necesario mediante la función FreeADsMem .

El orden de los valores de atributo devueltos no es necesariamente el mismo que el orden en que se solicitaron los atributos. Por lo tanto, es necesario comparar los nombres de atributo devueltos de ADSI.

Nota:

La estructura ADS_ATTR_INFO no devuelve todos los atributos solicitados. Solo los atributos que contienen valores forman parte de la estructura devuelta.

 

El número de atributos devueltos viene determinado por el parámetro dwNumberAttributes pasado al método IDirectoryObject::GetObjectAttributes .

En el ejemplo de código siguiente se enlaza a un objeto y se usa el método IDirectoryObject::GetObjectAttributes para recuperar atributos del 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();