Platform SDK: Active Directory, ADSI, and Directory Services |
The IADsObjectOptions interface gives direct access to setting and retrieving provider-specific options. This is currently supported only in Active Directory.
One of the Active Directory object options is to return the host name of a server. This example routine uses the interface to retrieve the host name of the global catalog server.
HRESULT GetGCServerName(VARIANT *vGCServer) { HRESULT hr, hre; IADsContainer *pContainer = NULL; IUnknown *pUnk = NULL; IEnumVARIANT *pEnum = NULL; IDispatch *pDisp = NULL; IADsObjectOptions *pOpt = NULL; VARIANT var; ULONG lFetch; // Bind to the global catalog using a serverless bind. hr = ADsOpenObject(L"GC:", NULL, NULL, ADS_SECURE_AUTHENTICATION, IID_IADsContainer, (void**) &pContainer ); if (FAILED(hr)) return (hr); hr = pContainer->get__NewEnum(&pUnk); if (SUCCEEDED(hr)) { hr = pUnk->QueryInterface(IID_IEnumVARIANT, (void**) &pEnum); if (SUCCEEDED(hr)) { // Now enumerate - there is only one item here. hr = pEnum->Next(1, &var, &lFetch); if (SUCCEEDED(hr)) { while (SUCCEEDED(hr)) { if (lFetch == 1) { pDisp = V_DISPATCH(&var); hre = pDisp->QueryInterface( IID_IADsObjectOptions, (void**)&pOpt); if (pDisp) pDisp->Release(); } VariantClear(&var); hr = pEnum->Next(1, &var, &lFetch); } // S_FALSE means all of the row is read properly. if (hr == S_FALSE) hr = hre; } if (SUCCEEDED(hr)) { // There is a valid pOpt, so request the server name. VariantInit(vGCServer); hr = pOpt->GetOption(ADS_OPTION_SERVERNAME,vGCServer); } } } // Clean up. if (pOpt) pOpt->Release(); if (pEnum) pEnum->Release(); if (pUnk) pUnk->Release(); if (pContainer) pContainer->Release(); return (hr); }