Share via


Enlace a objetos secundarios

En ADSI, un objeto contenedor expone la interfaz IADsContainer . El método IADsContainer::GetObject se usa para enlazar directamente a un objeto secundario. El objeto devuelto por IADsContainer::GetObject tiene el mismo contexto de seguridad que el objeto en el que se llamó al método. Esto significa que, si se usan credenciales alternativas, las credenciales alternativas no tienen que pasarse de nuevo a la función de enlace o al método para mantener las mismas credenciales.

El método IADsContainer::GetObject toma un nombre distintivo relativo (RDN) relativo al objeto actual. Este método también toma un nombre de clase opcional y devuelve un puntero de interfaz IDispatch que representa el objeto secundario. Para obtener la interfaz ADSI deseada, como los IAD, llame al método QueryInterface de este puntero de interfaz IDispatch .

En el siguiente ejemplo de código de C++ se muestra una función que recupera un objeto secundario 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;
}