Associazione a oggetti figlio
In ADSI un oggetto contenitore espone l'interfaccia IADsContainer . Il metodo IADsContainer::GetObject viene usato per eseguire l'associazione diretta a un oggetto figlio. L'oggetto restituito da IADsContainer::GetObject ha lo stesso contesto di sicurezza dell'oggetto in cui è stato chiamato il metodo. Ciò significa che, se si usano credenziali alternative, non è necessario passare nuovamente le credenziali alternative alla funzione di associazione o al metodo per mantenere le stesse credenziali.
Il metodo IADsContainer::GetObject accetta un nome distinto relativo (RDN) relativo all'oggetto corrente. Questo metodo accetta anche un nome di classe facoltativo e restituisce un puntatore all'interfaccia IDispatch che rappresenta l'oggetto figlio. Per ottenere l'interfaccia ADSI desiderata, ad esempio IAD, chiamare il metodo QueryInterface di questo puntatore all'interfaccia IDispatch.
Nell'esempio di codice C++ seguente viene illustrata una funzione che recupera un oggetto figlio specificato.
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;
}