Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Es gibt drei Enumeratorhilfsfunktionen, die von C/C++ verwendet werden können, um die Navigation von Active Directory-Objekten zu unterstützen. Sie sind ADsBuildEnumerator, ADsEnumerateNextund ADsFreeEnumerator.
ADsBuildEnumerator
Die ADsBuildEnumerator- Hilfsfunktion kapselt den Code, der zum Erstellen eines Enumerationsobjekts erforderlich ist. Sie ruft die IADsContainer::get__NewEnum-Methode auf, um ein Enumerationsobjekt zu erstellen, und ruft dann die QueryInterface-Methode von IUnknown auf, um einen Zeiger auf die IEnumVARIANT- Schnittstelle für dieses Objekt abzurufen. Das Enumerationsobjekt ist der Automatisierungsmechanismus zum Aufzählen von Containern. Verwenden Sie die ADsFreeEnumerator--Funktion, um dieses Enumerationsobjekt freizugeben.
ADsEnumerateNext
Die ADsEnumerateNext Hilfsfunktion füllt ein VARIANT-Array mit Elementen auf, die aus einem Enumerationsobjekt abgerufen wurden. Die Anzahl der abgerufenen Elemente kann kleiner sein als die angeforderte Zahl.
ADsFreeEnumerator
Gibt ein Enumeratorobjekt frei, das zuvor über die ADsBuildEnumerator--Funktion erstellt wurde.
Das folgende Codebeispiel zeigt eine Funktion, die Enumeratorhilfsfunktionen in C++ verwendet.
/*****************************************************************************
Function: TestEnumObject
Arguments: pszADsPath - ADsPath of the container to be enumerated (WCHAR*).
Return: S_OK if successful, an error code otherwise.
Purpose: Example using ADsBuildEnumerator, ADsEnumerateNext and
ADsFreeEnumerator.
******************************************************************************/
#define MAX_ENUM 100
HRESULT
TestEnumObject( LPWSTR pszADsPath )
{
ULONG cElementFetched = 0L;
IEnumVARIANT * pEnumVariant = NULL;
VARIANT VariantArray[MAX_ENUM];
HRESULT hr = S_OK;
IADsContainer * pADsContainer = NULL;
DWORD dwObjects = 0, dwEnumCount = 0, i = 0;
BOOL fContinue = TRUE;
hr = ADsGetObject(
pszADsPath,
IID_IADsContainer,
(void **)&pADsContainer
);
if (FAILED(hr)) {
printf("\"%S\" is not a valid container object.\n", pszADsPath) ;
goto exitpoint ;
}
hr = ADsBuildEnumerator(
pADsContainer,
&pEnumVariant
);
if( FAILED( hr ) )
{
printf("ADsBuildEnumerator failed with %lx\n", hr ) ;
goto exitpoint ;
}
fContinue = TRUE;
while (fContinue) {
IADs *pObject ;
hr = ADsEnumerateNext(
pEnumVariant,
MAX_ENUM,
VariantArray,
&cElementFetched
);
if ( FAILED( hr ) )
{
printf("ADsEnumerateNext failed with %lx\n",hr);
goto exitpoint;
}
if (hr == S_FALSE) {
fContinue = FALSE;
}
dwEnumCount++;
for (i = 0; i < cElementFetched; i++ ) {
IDispatch *pDispatch = NULL;
BSTR bstrADsPath = NULL;
pDispatch = VariantArray[i].pdispVal;
hr = V_DISPATCH( VariantArray + i )->QueryInterface(IID_IADs, (void **) &pObject) ;
if( SUCCEEDED( hr ) )
{
pObject->get_ADsPath( &bstrADsPath );
printf( "%S\n", bstrADsPath );
}
pObject->Release();
VariantClear( VariantArray + i );
SysFreeString( bstrADsPath );
}
dwObjects += cElementFetched;
}
printf("Total Number of Objects enumerated is %d\n", dwObjects);
exitpoint:
if (pEnumVariant) {
ADsFreeEnumerator( pEnumVariant );
}
if (pADsContainer) {
pADsContainer->Release();
}
return(hr);
}