home *** CD-ROM | disk | FTP | other *** search
- //----------------------------------------------------------------------------
- //
- // 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);
- }
-
-
-