Fonctions d’assistance d’énumération
Il existe trois fonctions d’assistance d’énumérateur qui peuvent être utilisées à partir de C/C++ pour faciliter la navigation des objets Active Directory. Il s’agit de ADsBuildEnumerator, ADsEnumerateNext et ADsFreeEnumerator.
ADsBuildEnumerator
La fonction d’assistance ADsBuildEnumerator encapsule le code requis pour créer un objet énumérateur. Il appelle la méthode IADsContainer::get__NewEnum pour créer un objet énumérateur, puis appelle la méthode QueryInterfaced’IUnknown pour obtenir un pointeur vers l’interface IEnumVARIANT pour cet objet. L’objet énumération est le mécanisme Automation pour énumérer les conteneurs. Utilisez la fonction ADsFreeEnumerator pour libérer cet objet énumérateur.
ADsEnumerateNext
La fonction d’assistance ADsEnumerateNext remplit un tableau VARIANT avec des éléments extraits d’un objet énumérateur. Le nombre d’éléments récupérés peut être inférieur au nombre demandé.
ADsFreeEnumerator
Libère un objet énumérateur précédemment créé via la fonction ADsBuildEnumerator .
L’exemple de code suivant montre une fonction qui utilise des fonctions d’assistance d’énumérateur en C++.
/*****************************************************************************
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);
}