다음을 통해 공유


IDirectoryObject::GetObjectAttributes 메서드(iads.h)

IDirectoryObject::GetObjectAttributes 메서드는 디렉터리 서비스 개체의 지정된 특성을 하나 이상 검색합니다.

구문

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

매개 변수

[in] pAttributeNames

요청된 특성의 이름 배열을 지정합니다.

개체의 모든 특성을 요청하려면 pAttributeNamesNULL 로 설정하고 dwNumberAttributes 매개 변수를 (DWORD)-1로 설정합니다.

[in] dwNumberAttributes

pAttributeNames 배열의 크기를 지정합니다. -1이면 개체의 모든 특성이 요청됩니다.

[out] ppAttributeEntries

요청된 특성 값이 포함된 ADS_ATTR_INFO 구조체 배열에 대한 포인터를 수신하는 변수에 대한 포인터입니다. 디렉터리 서비스 개체에서 특성을 가져올 수 없는 경우 반환된 포인터는 NULL입니다.

[out] pdwNumAttributesReturned

ppAttributeEntries 배열에서 검색된 특성 수를 수신하는 DWORD 변수에 대한 포인터입니다.

반환 값

이 메서드는 표준 값과 다음을 반환합니다.

자세한 내용 및 기타 반환 값은 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