Condividi tramite


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;
}