Source code of Windows XP (NT5)
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
/*++
Copyright (c) 1997 Microsoft Corporation
Module Name: adsiloc.cxx
Abstract: Connects with servers. Enumerates servers
Author: Sean Woodward (t-seanwo) 10/2/1997
Revision History:
--*/
// defined functions
// dump: dumps the Service Elements
#include "svcloc.h"
// TODO: Filter out the non-IIS services
int ServiceDump(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; IADs * pADsProp = NULL; VARIANT * pVariantArray = NULL; VARIANT varProperty;
DWORD dwNumProperties = 0; BSTR bstrPropName = NULL; DWORD i = 0; IDispatch * pDispatch = NULL;
//
// Access the schema for the object
//
hr = GetPropertyList( pADs, &pVariantArray, &dwNumProperties ); BAIL_ON_FAILURE(hr);
//
// Get the information on the object
//
hr = pADs->GetInfo(); BAIL_ON_FAILURE(hr);
//
// Loop and retrieve all properties
//
for (i = 0; i < dwNumProperties; i++ ) {
pDispatch = (pVariantArray + i)->pdispVal;
hr = pDispatch->QueryInterface( IID_IADs, (void **)&pADsProp ); BAIL_ON_FAILURE(hr);
pDispatch->Release();
hr = pADsProp->get_Name(&bstrPropName);
pADsProp->Release();
BAIL_ON_FAILURE(hr);
//
// Get a property and print it out. The HRESULT is passed to
// PrintProperty.
//
hr = pADs->Get( bstrPropName, &varProperty );
PrintProperty( bstrPropName, hr, varProperty );
if (bstrPropName) { SysFreeString(bstrPropName); }
}
error: free(pVariantArray); return(hr); }
HRESULT GetPropertyList( IADs * pADs, VARIANT ** ppVariant, PDWORD pcElementFetched ) { HRESULT hr= S_OK; BSTR bstrSchemaPath = NULL; IADsContainer * pADsContainer = NULL; IEnumVARIANT * pEnumVariant = NULL; BOOL fContinue = TRUE; ULONG cthisElement = 0L; ULONG cElementFetched = 0L; LPBYTE pVariantArray = NULL; VARIANT varProperty; DWORD cb = 0;
hr = pADs->get_Schema(&bstrSchemaPath); BAIL_ON_FAILURE(hr);
hr = ADsGetObject( bstrSchemaPath, IID_IADsContainer, (void **)&pADsContainer ); BAIL_ON_FAILURE(hr);
hr = ADsBuildEnumerator( pADsContainer, &pEnumVariant ); BAIL_ON_FAILURE(hr);
while (fContinue) {
VariantInit(&varProperty); hr = ADsEnumerateNext( pEnumVariant, 1, &varProperty, &cthisElement );
if (hr == S_FALSE) { fContinue = FALSE; break; }
pVariantArray = (LPBYTE)realloc( (void *)pVariantArray, cb + sizeof(VARIANT) );
if (!pVariantArray) { hr = E_OUTOFMEMORY; BAIL_ON_FAILURE(hr); }
memcpy(pVariantArray + cb, (LPBYTE)&varProperty, sizeof(VARIANT)); cb += sizeof(VARIANT);
cElementFetched += cthisElement;
}
*ppVariant = (LPVARIANT)pVariantArray; *pcElementFetched = cElementFetched;
error: if (bstrSchemaPath) { SysFreeString(bstrSchemaPath); }
if (pADsContainer) { pADsContainer->Release(); }
return(hr); }
|