ENUM.CXX
资源名称:MSDN_VC98.zip [点击查看]
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:4k
源码类别:
Windows编程
开发平台:
Visual C++
- //----------------------------------------------------------------------------
- //
- // 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 %dn", dwObjects);
- if (pEnumVariant) {
- pEnumVariant->Release();
- }
- if (pADsContainer) {
- pADsContainer->Release();
- }
- return(S_OK);
- error:
- if (FAILED(hr)) {
- printf("Unable to list contents of: %Sn", 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);
- }