次の方法で共有


IDirectoryObject::GetObjectAttributes メソッド (iads.h)

IDirectoryObject::GetObjectAttributes メソッドは、ディレクトリ サービス オブジェクトの 1 つ以上の指定された属性を取得します。

構文

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