mirror of https://github.com/tongzx/nt5src
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.
162 lines
2.8 KiB
162 lines
2.8 KiB
//----------------------------------------------------------------------
|
|
//
|
|
// 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);
|
|
}
|
|
|