Привязка к дочерним объектам
В ADSI объект контейнера предоставляет интерфейс IADsContainer. Метод IADsContainer::GetObject используется для привязки непосредственно к дочернему объекту. Объект, возвращаемый IADsContainer::GetObject , имеет тот же контекст безопасности, что и объект, на котором был вызван метод. Это означает, что если используются альтернативные учетные данные, альтернативные учетные данные не должны передаваться в функцию привязки или метод повторно для поддержания этих же учетных данных.
Метод IADsContainer::GetObject принимает относительное различающееся имя (RDN), которое относительно текущего объекта. Этот метод также принимает необязательное имя класса и возвращает указатель интерфейса IDispatch , представляющий дочерний объект. Чтобы получить нужный интерфейс ADSI, например идентификаторы IAD, вызовите метод QueryInterface этого указателя интерфейса IDispatch.
В следующем примере кода C++ показана функция, извлекающая указанный дочерний объект.
HRESULT GetChildObject(IADs *pObject,
LPCWSTR pwszClass,
LPCWSTR pwszRDN,
IADs **ppChild)
{
if(NULL == ppChild)
{
return E_INVALIDARG;
}
*ppChild = NULL;
if((NULL == pObject) || (NULL == pwszRDN))
{
return E_INVALIDARG;
}
HRESULT hr;
IADsContainer *pCont;
hr = pObject->QueryInterface(IID_IADsContainer, (LPVOID*)&pCont);
if(SUCCEEDED(hr))
{
BSTR bstrClass = NULL;
if(pwszClass)
{
bstrClass = SysAllocString(pwszClass);
}
BSTR bstrRDN = SysAllocString(pwszRDN);
if(bstrRDN)
{
IDispatch *pDisp;
hr = pCont->GetObject(bstrClass, bstrRDN, &pDisp);
if(SUCCEEDED(hr))
{
hr = pDisp->QueryInterface(IID_IADs, (LPVOID*)ppChild);
pDisp->Release();
}
}
else
{
hr = E_OUTOFMEMORY;
}
if(bstrRDN)
{
SysFreeString(bstrRDN);
}
if(bstrClass)
{
SysFreeString(bstrClass);
}
pCont->Release();
}
return hr;
}