//---------------------------------------------------------------------- // // Microsoft Active Directory 1.0 Sample Code // // Copyright (C) Microsoft Corporation, 1996 // // File: dump.cxx // // Contents: Functions for dumping the properties for an object. // // //---------------------------------------------------------------------- #include "main.hxx" // // Given an ADsPath, bind to the object and call the DumpObject routine. // int DoDump(char *AnsiADsPath) { HRESULT hr = E_OUTOFMEMORY ; LPWSTR pszADsPath = NULL; IADs * pADs = NULL; // // Convert path to unicode and then bind to the object. // BAIL_ON_NULL(pszADsPath = AllocateUnicodeString(AnsiADsPath)); hr = ADsGetObject( pszADsPath, IID_IADs, (void **)&pADs ); if (FAILED(hr)) { printf("Failed to bind to object: %S\n", pszADsPath) ; } else { // // Dump the object // hr = DumpObject(pADs); if (FAILED(hr)) { printf("Unable to read properties of: %S\n", pszADsPath) ; } pADs->Release(); } error: FreeUnicodeString(pszADsPath); return (FAILED(hr) ? 1 : 0) ; } // // Given an ADs pointer, dump the contents of the object // HRESULT DumpObject( IADs * pADs ) { HRESULT hr; HRESULT hrSA; IADs * pADsProp = NULL; VARIANT var; ZeroMemory(&var,sizeof(var)); VARIANT * pvarPropName = NULL; DWORD i = 0; VARIANT varProperty; IDispatch * pDispatch = NULL; // // Access the schema for the object // hr = GetPropertyList( pADs, &var); BAIL_ON_FAILURE(hr); // // List the Properties // hr = SafeArrayAccessData(var.parray, (void **) &pvarPropName); BAIL_ON_FAILURE(hr); for (i = 0; i < var.parray->rgsabound[0].cElements; i++){ // // Get a property and print it out. The HRESULT is passed to // PrintProperty. // hr = pADs->Get( pvarPropName[i].bstrVal, &varProperty ); PrintProperty( pvarPropName[i].bstrVal, hr, varProperty ); } hr = SafeArrayUnaccessData(var.parray); error: // Don't destroy hr in case we're here from BAIL_ON_FAILURE if(var.parray) hrSA = SafeArrayDestroy(var.parray); return(hr); } HRESULT GetPropertyList( IADs * pADs, VARIANT * pvar ) { HRESULT hr= S_OK; BSTR bstrSchemaPath = NULL; IADsClass * pADsClass = NULL; hr = pADs->get_Schema(&bstrSchemaPath); BAIL_ON_FAILURE(hr); hr = ADsGetObject( bstrSchemaPath, IID_IADsClass, (void **)&pADsClass); BAIL_ON_FAILURE(hr); //Put SafeArray of bstr's into input variant struct hr = pADsClass->get_MandatoryProperties(pvar); BAIL_ON_FAILURE(hr); error: if (bstrSchemaPath) { SysFreeString(bstrSchemaPath); } if (pADsClass) { pADsClass->Release(); } return(hr); }