Поделиться через


Доступ к атрибутам с помощью интерфейса IDirectoryObject

Интерфейс IDirectoryObject предоставляет клиентское приложение, написанное на C и C++ с прямым доступом к объектам службы каталогов. Интерфейс обеспечивает доступ через прямой сетевой протокол, а не через кэш атрибутов ADSI. Вместо свойств, поддерживаемых интерфейсом IADs , IDirectoryObject предоставляет методы, поддерживающие критически важный набор методов обслуживания объекта и предоставляющие доступ к его атрибутам. С помощью IDirectoryObject клиент может получить или задать любое количество атрибутов объекта с одним вызовом метода. В отличие от соответствующих методов автоматизации, которые пакетны, при вызове выполняются те из IDirectoryObject . Так как методы в этом интерфейсе не требуют создания экземпляра объекта каталога службы автоматизации, затраты на производительность невелики.

Клиенты, написанные на таких языках, как C и C++, должны использовать методы интерфейса IDirectoryObject для оптимизации производительности и использования собственных интерфейсов службы каталогов. Клиенты службы автоматизации не могут использовать IDirectoryObject. Вместо этого они должны использовать интерфейс IADs.

Метод IDirectoryObject::GetObjectAttributes извлекает атрибуты с одним и несколькими значениями. Этот метод принимает список запрошенных атрибутов и возвращает ADS_ATTR_INFO структуру. ADSI выделяет эту структуру; Вызывающий объект должен освободить эту память, если она больше не требуется с помощью функции FreeADsMem.

Порядок возвращаемых значений атрибутов не обязательно совпадает с порядком запроса атрибутов. Поэтому необходимо сравнить имена атрибутов, возвращаемые из ADSI.

Примечание.

Структура ADS_ATTR_INFO не возвращает все запрошенные атрибуты. Только те атрибуты, которые содержат значения, являются частью возвращаемой структуры.

 

Число возвращаемых атрибутов определяется параметром dwNumberAttributes, переданным методу IDirectoryObject::GetObjectAttributes.

Следующий пример кода привязывается к объекту и использует метод IDirectoryObject::GetObjectAttributes для получения атрибутов объекта.

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