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