Exemple de code pour la recherche d’une forêt
Cette rubrique contient un exemple de code qui recherche une forêt.
L’exemple de code C/C++ suivant lie à la racine du catalogue global et énumère l’objet unique, qui est la racine de la forêt, afin qu’il puisse être utilisé pour rechercher la forêt entière.
Set gc = GetObject("GC:")
For each child in gc
Set entpr = child
Next
' Now entpr is an object that can be used
' to search the entire forest.
L’exemple de code C/C++ suivant contient une fonction qui retourne un pointeur IDirectorySearch utilisé pour rechercher l’ensemble de la forêt.
La fonction effectue une liaison serverless à la racine du catalogue global, énumère l’élément unique, qui est la racine de la forêt et peut être utilisé pour rechercher l’ensemble de la forêt, appelle QueryInterface pour obtenir un pointeur IDirectorySearch vers l’objet et retourne ce pointeur à utiliser par l’appelant pour effectuer une recherche dans la forêt.
HRESULT GetGC(IDirectorySearch **ppDS)
{
HRESULT hr;
IEnumVARIANT *pEnum = NULL;
IADsContainer *pCont = NULL;
VARIANT var;
IDispatch *pDisp = NULL;
ULONG lFetch;
// Set IDirectorySearch pointer to NULL.
*ppDS = NULL;
// First, bind to the GC: namespace container object.
hr = ADsOpenObject(TEXT("GC:"),
NULL,
NULL,
ADS_SECURE_AUTHENTICATION, // Use Secure Authentication.
IID_IADsContainer,
(void**)&pCont);
if (FAILED(hr)) {
_tprintf(TEXT("ADsOpenObject failed: 0x%x\n"), hr);
goto cleanup;
}
// Get an enumeration interface for the GC container to enumerate the
// contents. The actual GC is the only child of the GC container.
hr = ADsBuildEnumerator(pCont, &pEnum);
if (FAILED(hr)) {
_tprintf(TEXT("ADsBuildEnumerator failed: 0x%x\n"), hr);
goto cleanup;
}
// Now enumerate. There is only one child of the GC: object.
hr = pEnum->Next(1, &var, &lFetch);
if (FAILED(hr)) {
_tprintf(TEXT("ADsEnumerateNext failed: 0x%x\n"), hr);
goto cleanup;
}
// Get the IDirectorySearch pointer.
if (( hr == S_OK ) && ( lFetch == 1 ) )
{
pDisp = V_DISPATCH(&var);
hr = pDisp->QueryInterface( IID_IDirectorySearch, (void**)ppDS);
}
cleanup:
if (pEnum)
ADsFreeEnumerator(pEnum);
if (pCont)
pCont->Release();
if (pDisp)
(pDisp)->Release();
return hr;
}