Freigeben über


Bindung an untergeordnete Objekte

In ADSI macht ein Containerobjekt die IADsContainer-Schnittstelle verfügbar. Die IADsContainer::GetObject-Methode wird verwendet, um direkt an ein untergeordnetes Objekt zu binden. Das von IADsContainer::GetObject zurückgegebene Objekt verfügt über denselben Sicherheitskontext wie das Objekt, für das die Methode aufgerufen wurde. Dies bedeutet, dass bei Verwendung alternativer Anmeldeinformationen die alternativen Anmeldeinformationen nicht erneut an die Bindungsfunktion oder -methode übergeben werden müssen, um dieselben Anmeldeinformationen beizubehalten.

Die IADsContainer::GetObject-Methode verwendet einen relativen Distinguished Name (RDN), der relativ zum aktuellen Objekt ist. Diese Methode verwendet auch einen optionalen Klassennamen und gibt einen IDispatch-Schnittstellenzeiger zurück, der das untergeordnete Objekt darstellt. Um die gewünschte ADSI-Schnittstelle wie IADs abzurufen, rufen Sie die QueryInterface-Methode dieses IDispatch-Schnittstellenzeigers auf.

Das folgende C++-Codebeispiel zeigt eine Funktion, die ein angegebenes untergeordnetes Objekt abruft.

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