Vinculação a objetos filho
No ADSI, um objeto de contêiner expõe a interface IADsContainer. O método IADsContainer::GetObject é usado para vincular diretamente a um objeto filho. O objeto retornado por IADsContainer::GetObject tem o mesmo contexto de segurança que o objeto no qual o método foi chamado. Isso significa que, se credenciais alternativas forem usadas, as credenciais alternativas não precisarão ser passadas para a função ou método de vinculação novamente para manter as mesmas credenciais.
O método IADsContainer::GetObject usa um nome distinto relativo (RDN) que é relativo ao objeto atual. Esse método também usa um nome de classe opcional e retorna um ponteiro de interface IDispatch que representa o objeto filho. Para obter a interface ADSI desejada, como IADs, chame o método QueryInterface deste ponteiro de interface IDispatch.
O exemplo de código C++ a seguir mostra uma função que recupera um objeto filho especificado.
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;
}