共用方式為


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