Freigeben über


Beispielcode für die Suche nach einer Gesamtstruktur

Dieses Thema enthält Beispielcode, der eine Gesamtstruktur durchsucht.

Das folgende C/C++-Codebeispiel bindet an den Stamm des globalen Katalogs und listet das einzelne Objekt auf, das den Stamm der Gesamtstruktur darstellt, sodass es zum Durchsuchen der gesamten Gesamtstruktur verwendet werden kann.

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.

Das folgende C/C++-Codebeispiel enthält eine Funktion, die einen IDirectorySearch-Zeiger zurückgibt, der zum Durchsuchen der gesamten Gesamtstruktur verwendet wird.

Die Funktion führt eine serverlose Bindung an den Stamm des globalen Katalogs aus, listet das einzelne Element auf, das der Stamm der Gesamtstruktur ist und zum Durchsuchen der gesamten Gesamtstruktur verwendet werden kann, ruft QueryInterface auf, um einen IDirectorySearch-Zeiger auf das Objekt abzurufen, und gibt diesen Zeiger zurück, der vom Aufrufer zum Durchsuchen der Gesamtstruktur verwendet werden kann.

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