绑定到子对象
在 ADSI 中,容器对象会公开 IADsContainer 接口。 IADsContainer::GetObject 方法可用于直接绑定到子对象。 IADsContainer::GetObject 返回的对象与对其调用该方法的对象具有同一安全上下文。 这意味着,如果使用备用凭据,则无需再次将备用凭据传递给绑定函数或方法来维护相同的凭据。
IADsContainer::GetObject 方法采用相对于当前对象的相对可分辨名称 (RDN)。 此方法还采用可选类名并返回表示子对象的 IDispatch 接口指针。 若要获取所需的 ADSI 接口(如 IADs),请调用此 IDispatch 接口指针的 QueryInterface 方法。
以下 C++ 代码示例演示了用于检索指定子对象的函数。
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;
}