FIX: ADSI adscmd Sample Dump Option Fails

ID: Q169396


The information in this article applies to:
  • Microsoft Win32 Software Development Kit (SDK)


SYMPTOMS

The dump option in the adscmd sample provided with the ADSI 1.0 SDK does not work.


RESOLUTION

You can enable the dump option by replacing main.hxx and dump.cxx files with the code in the "More Information" section.


STATUS

Microsoft has confirmed this to be a bug in the ADSI sample code released with the ADSI 1.0 SDK.


MORE INFORMATION

Sample Code

Replace Main.hxx with the following code:

   //----------------------------------------------------------------------
   // 
   //  Microsoft Active Directory 1.0 Sample Code
   // 
   //  Copyright (C) Microsoft Corporation, 1996
   // 
   //  File:       main.hxx
   // 
   //  Contents:   Main include file for adscmd
   // 
   // 
   //----------------------------------------------------------------------

   // 
   // ********* System Includes
   // 

   #define UNICODE
   #define _UNICODE
   #define INC_OLE2

   #include <windows.h>

   // 
   // ********* CRunTime Includes
   // 

   #include <stdlib.h>
   #include <limits.h>
   #include <io.h>
   #include <stdio.h>

   // 
   // *********  Public ADs includes
   // 

   #include <activeds.h>

   // 
   // *********  Useful macros
   // 

   #define BAIL_ON_NULL(p)       \ 
        if (!(p)) {           \ 
                goto error;   \ 
        }

   #define BAIL_ON_FAILURE(hr)   \ 
        if (FAILED(hr)) {     \ 
                goto error;   \ 
        }

   #define FREE_INTERFACE(pInterface) \ 
        if (pInterface) {          \ 
            pInterface->Release(); \ 
            pInterface=NULL;       \ 
        }

   #define FREE_BSTR(bstr)            \ 
        if (bstr) {                \ 
            SysFreeString(bstr);   \ 
            bstr = NULL;           \ 
        }

   // 
   // *********  Prototypes
   // 

   void
   PrintUsage(

    void
    );

   int
   AnsiToUnicodeString(

    LPSTR pAnsi,
    LPWSTR pUnicode,
    DWORD StringLength
    );

   int
   UnicodeToAnsiString(

    LPWSTR pUnicode,
    LPSTR pAnsi,
    DWORD StringLength
    );

   LPWSTR
   AllocateUnicodeString(

    LPSTR  pAnsiString
    );

   void
   FreeUnicodeString(

    LPWSTR  pUnicodeString
    );

   HRESULT
   PrintVariantArray(

    VARIANT var
    );

   HRESULT
   PrintVariant(

    VARIANT varPropData
    );

   HRESULT
   PrintProperty(

    BSTR bstrPropName,
    HRESULT hRetVal,
    VARIANT varPropData
    );

   HRESULT
   GetPropertyList(

    IADs * pADs,
    VARIANT * pvar
    );

   // 
   // Functions to dump contents of an object
   // 

   int
   DoDump(

    char *AnsiADsPath
    ) ;

   HRESULT
   DumpObject(

    IADs * pADs
    );

   // 
   // Functions to list objects within a container.
   // 

   int
   DoList(

    char *AnsiADsPath
    ) ;

   HRESULT
   EnumObject(

    LPWSTR pszADsPath,
    LPWSTR * lppClassNames,
    DWORD dwClassNames
    ) ;

Replace dump.cxx with the following code

   //----------------------------------------------------------------------
   // 
   //  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);

   } 

Additional query words:

Keywords : kbcode kbADSI
Version : WINDOWS:
Platform : WINDOWS
Issue type : kbbug


Last Reviewed: October 4, 1999
© 2000 Microsoft Corporation. All rights reserved. Terms of Use.