Метод 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 |