|
|
//----------------------------------------------------------------------------
//
// Microsoft Active Directory 1.0 Sample Code
//
// Copyright (C) Microsoft Corporation, 1996
//
// File: enum.cxx
//
// Contents: Active Drectory container enumeration
//
//
//----------------------------------------------------------------------------
#include "main.hxx"
//
// Private defines
//
#define MAX_ADS_FILTERS 10
#define MAX_ADS_ENUM 100 // number of entries to read each time
//
// Local functions
//
HRESULT PrintLongFormat( IADs * pObject );
//
// List contents of a container identified by the ADsPath
//
int DoList(char * AnsiADsPath) { HRESULT hr; int i = 0 ; LPWSTR pszADsPath, apszTypes[MAX_ADS_FILTERS] ;
if (!(pszADsPath = AllocateUnicodeString(AnsiADsPath))) {
return(1) ; }
apszTypes[0] = NULL ;
//
// Filter may be set as follows. For example, to get users and group:
//
// apszTypes[0] = L"User" ;
// apszTypes[1] = L"Group" ;
// apszTypes[2] = NULL ;
//
hr = EnumObject( pszADsPath, apszTypes, i );
return (FAILED(hr) ? 1 : 0) ; }
//
// Enumerates the contents of a container object.
//
HRESULT EnumObject( LPWSTR pszADsPath, LPWSTR * lppClassNames, DWORD dwClassNames ) { ULONG cElementFetched = 0L; IEnumVARIANT * pEnumVariant = NULL; VARIANT VarFilter, VariantArray[MAX_ADS_ENUM];
HRESULT hr; IADsContainer * pADsContainer = NULL; DWORD dwObjects = 0, dwEnumCount = 0, i = 0; BOOL fContinue = TRUE;
VariantInit(&VarFilter);
hr = ADsGetObject( pszADsPath, IID_IADsContainer, (void **)&pADsContainer );
if (FAILED(hr)) {
printf("\"%S\" is not a valid container object.\n", pszADsPath) ; goto exitpoint ; }
hr = ADsBuildVarArrayStr( lppClassNames, dwClassNames, &VarFilter ); BAIL_ON_FAILURE(hr);
hr = pADsContainer->put_Filter(VarFilter); BAIL_ON_FAILURE(hr);
hr = ADsBuildEnumerator( pADsContainer, &pEnumVariant ); BAIL_ON_FAILURE(hr);
while (fContinue) {
IADs *pObject ;
hr = ADsEnumerateNext( pEnumVariant, MAX_ADS_ENUM, VariantArray, &cElementFetched );
if (hr == S_FALSE) { fContinue = FALSE; }
dwEnumCount++;
for (i = 0; i < cElementFetched; i++ ) {
IDispatch *pDispatch = NULL;
pDispatch = VariantArray[i].pdispVal;
hr = pDispatch->QueryInterface(IID_IADs, (VOID **) &pObject) ; BAIL_ON_FAILURE(hr);
PrintLongFormat(pObject);
pObject->Release(); pDispatch->Release(); }
memset(VariantArray, 0, sizeof(VARIANT)*MAX_ADS_ENUM);
dwObjects += cElementFetched;
}
printf("Total Number of Objects enumerated is %d\n", dwObjects);
if (pEnumVariant) { pEnumVariant->Release(); }
if (pADsContainer) { pADsContainer->Release(); }
return(S_OK);
error: if (FAILED(hr)) {
printf("Unable to list contents of: %S\n", pszADsPath) ; }
exitpoint:
if (pEnumVariant) { pEnumVariant->Release(); }
VariantClear(&VarFilter);
if (pADsContainer) { pADsContainer->Release(); }
return(hr); }
HRESULT PrintLongFormat(IADs * pObject) {
HRESULT hr = S_OK; BSTR bstrName = NULL; BSTR bstrClass = NULL; BSTR bstrSchema = NULL;
hr = pObject->get_Name(&bstrName) ; BAIL_ON_FAILURE(hr);
hr = pObject->get_Class(&bstrClass); BAIL_ON_FAILURE(hr);
// hr = pObject->get_Schema(&bstrSchema);
printf(" %S(%S)\n", bstrName, bstrClass) ;
error: if (bstrClass) { SysFreeString(bstrClass); } if (bstrName) { SysFreeString(bstrName); } if (bstrSchema) { SysFreeString(bstrSchema); } return(hr); }
|