objectClass 属性の取得

objectClass 属性には、オブジェクトがインスタンスであるクラスと、そのクラスが派生するすべてのクラスが含まれます。 たとえば、ユーザー クラスは top、personおよび organizationalPerson から継承されます。したがって、objectClass 属性には、これらのクラスの名前とユーザーが含まれます。 では、オブジェクトがどのクラスのインスタンスであるかを調べるにはどうすればよいでしょうか。 objectClass 属性は、順序付けされた値を持つ複数の値を持つ唯一の属性です。 最初の値は最上位クラスであるクラス階層の最上位で、最後の値は最も派生したクラス (オブジェクトがインスタンスであるクラス) です。

次の関数は、objectClass 属性を含む列へのポインターを受け取り、オブジェクトのインスタンス化された objectClass を返します。

HRESULT GetClass(ADS_SEARCH_COLUMN *pcol, LPOLESTR *ppClass)
{
  if (!pcol)
    return E_POINTER;
 
  HRESULT hr = E_FAIL;
  if (ppClass)
  {
    LPOLESTR szClass = new OLECHAR[MAX_PATH];
    wcscpy_s(szClass, L"");
    if ( _wcsicmp(pcol->pszAttrName,L"objectClass") == 0 )
    {
      for (DWORD x = 0; x< pcol->dwNumValues; x++)
      {
        wcscpy_s(szClass, pcol->pADsValues[x].CaseIgnoreString);
      }
    }
    if (0==wcscmp(L"", szClass))
    {
      hr = E_FAIL;
    }
    else
    {
      //Allocate memory for string.
      //Caller must free using CoTaskMemFree.
      *ppClass = (OLECHAR *)CoTaskMemAlloc (
                             sizeof(OLECHAR)*(wcslen(szClass)+1));
      if (*ppClass)
      {
        wcscpy_s(*ppClass, szClass);
        hr = S_OK;
      }
      else
      hr=E_FAIL;
    }
  }
  return hr;
}