共用方式為


使用 IDirectoryObject 介面存取屬性

IDirectoryObject 介面提供以 C 和 C++ 撰寫的用戶端應用程式,可直接存取目錄服務物件。 介面會透過直接網路通訊協議來啟用存取,而不是透過 ADSI 屬性快取。 為了取代 IADs 介面所支援的屬性,IDirectoryObject 提供的方法可支援對象維護方法的重要子集,並提供其屬性的存取權。 使用 IDirectoryObject,用戶端可以使用一個方法呼叫來取得或設定任意數目的物件屬性。 與批處理的對應 Automation 方法不同,呼叫時會執行 IDirectoryObject那些方法。 由於此介面上的方法不需要建立 Automation 目錄對象的實例,因此效能負擔很小。

以 C 和 C++ 等語言撰寫的 用戶端應該使用 IDirectoryObject 介面的方法,將效能優化,並利用原生目錄服務介面。 自動化客戶端無法使用 IDirectoryObject。 相反地,它們應該使用 IADs 介面。

IDirectoryObject::GetObjectAttributes 方法會擷取具有單一和多個值的屬性。 此方法會取得要求的屬性清單,並傳 回ADS_ATTR_INFO 結構。 ADSI 會配置此結構;呼叫端在使用FreeADsMem函式不再需要時,必須釋放此記憶體。

傳回屬性值的順序不一定與要求屬性的順序相同。 因此,必須比較從 ADSI 傳回的屬性名稱。

注意

ADS_ATTR_INFO 結構不會傳回所要求的所有屬性。 只有包含值的那些屬性是傳回結構的一部分。

 

傳回的屬性數目取決於傳遞至 IDirectoryObject::GetObjectAttributes 方法的 dwNumberAttributes 參數。

下列程式代碼範例會系結至 物件,並使用 IDirectoryObject::GetObjectAttributes 方法來擷取對象的屬性。

HRESULT hr;
IDirectoryObject *pDirObject;

CoInitialize(NULL);

hr = ADsGetObject(
       L"LDAP://CN=Jeff Smith,OU=Users,DC=Fabrikam,DC=com",
       IID_IDirectoryObject, 
       (void**)&pDirObject);

if(SUCCEEDED(hr))
{
  ADS_ATTR_INFO *pAttrInfo = NULL;
  LPWSTR pAttrNames[] = {L"cn", L"title", L"otherTelephone"};
  DWORD dwNumAttr = sizeof(pAttrNames)/sizeof(LPWSTR);
  DWORD dwReturn;

  //////////////////////////////////////////////////
  // 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"cn") == 0)
        {
          if(pAttrInfo[idx].dwADsType == ADSTYPE_CASE_IGNORE_STRING)
          {
            wprintf(L"Common Name: %s\n", 
                    pAttrInfo[idx].pADsValues[0].CaseIgnoreString);
          }
        }
        else if(_wcsicmp(pAttrInfo[idx].pszAttrName, L"title") == 0)
        {
          if(pAttrInfo->dwADsType == ADSTYPE_CASE_IGNORE_STRING)
          {
            wprintf(L"Title: %s\n", 
                    pAttrInfo[idx].pADsValues[0].CaseIgnoreString);
          }
        }
        else if(_wcsicmp(pAttrInfo[idx].pszAttrName, 
                L"otherTelephone") == 0)
        {  
          // Print the multi-valued property, "Other Telephones".
          if(pAttrInfo[idx].dwADsType == ADSTYPE_CASE_IGNORE_STRING)
        {
          wprintf(L"Other Telephones:");
          for(DWORD val = 0; val < pAttrInfo[idx].dwNumValues; val++) 
          {
            wprintf(L"  %s\n", 
                    pAttrInfo[idx].pADsValues[val].CaseIgnoreString);
          }
        }
      }
    }

    FreeADsMem(pAttrInfo);
  }
     
  pDirObject->Release();
}

CoUninitialize();