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 为 ppAttributeEntries 参数中返回的ADS_ATTR_INFO结构的数组分配内存。 调用方必须调用 FreeADsMem 才能释放数组。

ppAttributeEntries 中返回的属性顺序不一定与 pAttributeNames 中请求的顺序相同。

IDirectoryObject::GetObjectAttributes 方法尝试读取所请求属性的架构定义,以便它可以在ADS_ATTR_INFO结构中包含的 ADSVALUE 结构中以适当的格式返回属性值。 但是,即使架构定义不可用,GetObjectAttributes 也可以成功,在这种情况下,ADS_ATTR_INFO结构的 dwADsType 成员返回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
标头 iads.h
DLL Activeds.dll

另请参阅

ADSI 错误代码

ADS_ATTR_INFO

FreeADsMem

IDirectoryObject