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


Метод IDirectoryObject::GetObjectAttributes (iads.h)

Метод IDirectoryObject::GetObjectAttributes извлекает один или несколько указанных атрибутов объекта службы каталогов.

Синтаксис

HRESULT GetObjectAttributes(
  [in]  LPWSTR         *pAttributeNames,
  [in]  DWORD          dwNumberAttributes,
  [out] PADS_ATTR_INFO *ppAttributeEntries,
  [out] DWORD          *pdwNumAttributesReturned
);

Параметры

[in] pAttributeNames

Задает массив имен запрошенных атрибутов.

Чтобы запросить все атрибуты объекта, задайте для параметра pAttributeNamesзначение NULL , а для параметра dwNumberAttributes задайте значение (DWORD)-1.

[in] dwNumberAttributes

Задает размер массива pAttributeNames . Если значение -1, запрашиваются все атрибуты объекта.

[out] ppAttributeEntries

Указатель на переменную, получающую указатель на массив ADS_ATTR_INFO структур, содержащих запрошенные значения атрибутов. Если из объекта службы каталогов не удалось получить атрибуты, возвращаемый указатель имеет значение NULL.

[out] pdwNumAttributesReturned

Указатель на переменную DWORD , которая получает количество атрибутов, полученных в массиве ppAttributeEntries .

Возвращаемое значение

Этот метод возвращает стандартные значения, а также следующие:

Дополнительные сведения и другие возвращаемые значения см. в разделе Коды ошибок ADSI.

Комментарии

ADSI выделяет память для массива ADS_ATTR_INFO структур, возвращаемых в параметре ppAttributeEntries . Вызывающий объект должен вызвать FreeADsMem , чтобы освободить массив.

Порядок атрибутов, возвращаемых в ppAttributeEntries , не обязательно совпадает с порядком, запрошенным в pAttributeNames.

Метод IDirectoryObject::GetObjectAttributes пытается прочитать определение схемы запрошенных атрибутов, чтобы он мог возвращать значения атрибутов в соответствующем формате в структурах ADSVALUE , содержащихся в структурах ADS_ATTR_INFO . Однако getObjectAttributes может завершиться успешно, даже если определение схемы недоступно. В этом случае элемент dwADsType структуры ADS_ATTR_INFO возвращает ADSTYPE_PROV_SPECIFIC, а значение возвращается в ADS_PROV_SPECIFIC структуре. При обработке результатов вызова GetObjectAttributes проверьте dwADsType , чтобы убедиться, что данные были возвращены в ожидаемом формате.

Примеры

В следующем примере кода показано, как можно использовать метод IDirectoryObject::GetObjectAttributes .

HRESULT hr;
IDirectoryObject *pDirObject = NULL;
 
hr = ADsGetObject(L"LDAP://CN=Jeff Smith,OU=Sales,DC=Fabrikam,DC=com",
                     IID_IDirectoryObject, 
                     (void**) &pDirObject );
 
if ( SUCCEEDED(hr) )
{
    ADS_ATTR_INFO *pAttrInfo=NULL;
    DWORD dwReturn;
    LPWSTR pAttrNames[]={L"givenName",L"sn", L"otherTelephone" };
    DWORD dwNumAttr=sizeof(pAttrNames)/sizeof(LPWSTR);

    //////////////////////////////////////////////////////
    // 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"givenName") == 0 )
            {
                switch (pAttrInfo[idx].dwADsType)
                {
                    case ADSTYPE_CASE_IGNORE_STRING:
                        printf("First Name: %S\n", pAttrInfo[idx].pADsValues->CaseIgnoreString);
                        break;
         
                    case ADSTYPE_PROV_SPECIFIC:
                        printf("First Name: %S\n", pAttrInfo[idx].pADsValues->ProviderSpecific.lpValue);
                        break;
         
                    default:
                        printf("Invalid ADsType: %d\n", pAttrInfo[idx].dwADsType);
                        break;
                }
            }
            else if ( _wcsicmp(pAttrInfo[idx].pszAttrName, L"sn") == 0 )
            {
                switch (pAttrInfo[idx].dwADsType)
                {
                    case ADSTYPE_CASE_IGNORE_STRING:
                        printf("Last Name: %S\n", pAttrInfo[idx].pADsValues->CaseIgnoreString);
                        break;
         
                    case ADSTYPE_PROV_SPECIFIC:
                        printf("Last Name: %S\n", pAttrInfo[idx].pADsValues->ProviderSpecific.lpValue);
                        break;
         
                    default:
                        printf("Invalid ADsType: %d\n", pAttrInfo[idx].dwADsType);
                        break;
                }
            }
            else if ( _wcsicmp(pAttrInfo[idx].pszAttrName, L"otherTelephone") == 0  )
            {   // Print the multi-valued property, "Other Telephones".
                switch (pAttrInfo[idx].dwADsType)
                {
                    case ADSTYPE_CASE_IGNORE_STRING:
                        printf("Other Telephones:");
                        for (DWORD val=0; val < pAttrInfo[idx].dwNumValues; val++) 
                        printf("  %S\n", pAttrInfo[idx].pADsValues[val].CaseIgnoreString);
                        break;
         
                    case ADSTYPE_PROV_SPECIFIC:
                        printf("Other Telephones:");
                        for (DWORD val=0; val < pAttrInfo[idx].dwNumValues; val++) 
                        printf("  %S\n", pAttrInfo[idx].pADsValues[val].CaseIgnoreString);
                        break;
         
                    default:
                        printf("Other Telephones:");
                        for (DWORD val=0; val < pAttrInfo[idx].dwNumValues; val++) 
                        printf("  %S\n", pAttrInfo[idx].pADsValues[val].CaseIgnoreString);
                        break;
                }
            }
        }

        /////////////////////////////////////////////////////////////
        // Use FreeADsMem for all memory obtained from the ADSI call. 
        /////////////////////////////////////////////////////////////
        FreeADsMem( pAttrInfo );
    
    }
 
    pDirObject->Release();
}

Требования

Требование Значение
Минимальная версия клиента Windows Vista
Минимальная версия сервера Windows Server 2008
Целевая платформа Windows
Header iads.h
DLL Activeds.dll

См. также раздел

Коды ошибок ADSI

ADS_ATTR_INFO

FreeADsMem

IDirectoryObject