다음을 통해 공유


IDirectoryObject 인터페이스를 사용하여 특성 액세스

IDirectoryObject 인터페이스는 디렉터리 서비스 개체에 직접 액세스할 수 있는 C 및 C++로 작성된 클라이언트 애플리케이션을 제공합니다. 인터페이스를 사용하면 ADSI 특성 캐시가 아닌 직접 네트워크 프로토콜을 통해 액세스할 수 있습니다. IDirectoryObjectIADs 인터페이스에서 지원하는 속성 대신 개체의 유지 관리 메서드의 중요한 하위 집합을 지원하고 해당 특성에 대한 액세스를 제공하는 메서드를 제공합니다. IDirectoryObject를 사용하면 클라이언트는 하나의 메서드 호출을 사용하여 원하는 수의 개체 특성을 얻거나 설정할 수 있습니다. 일괄 처리되는 해당 Automation 메서드와 달리 IDirectoryObject 의 메서드는 호출될 때 실행됩니다. 이 인터페이스의 메서드는 Automation 디렉터리 개체의 instance 만들 필요가 없으므로 성능 오버헤드가 적습니다.

C 및 C++와 같은 언어로 작성된 클라이언트는 IDirectoryObject 인터페이스의 메서드를 사용하여 성능을 최적화하고 네이티브 디렉터리 서비스 인터페이스를 활용해야 합니다. 자동화 클라이언트는 IDirectoryObject를 사용할 수 없습니다. 대신 IAD 인터페이스를 사용해야 합니다.

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();