home *** CD-ROM | disk | FTP | other *** search
/ io Programmo 27 / IOPROG_27.ISO / SOFT / ADSDK.ZIP / Samples / ActiveDir / CreateUser / vc / CreateUserHelpers.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1998-11-16  |  13.5 KB  |  501 lines

  1. #define INC_OLE2
  2. #define UNICODE 1
  3. #define _WIN32_DCOM
  4.  
  5. #include <windows.h>
  6. #include <winuser.h>
  7.  
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <string.h>
  11. #include <malloc.h>
  12. #include <winldap.h>
  13.  
  14. #include <activeds.h>
  15. #include <assert.h>
  16.  
  17. #include "CreateUserHelpers.h"
  18.  
  19.  
  20.  
  21.  
  22.  
  23.  
  24.  
  25.  
  26.  
  27.  
  28.  
  29.  
  30.  
  31.  
  32.  
  33. ////////////////////////////////////////////////////////////////////////////////////////////////////
  34. /*  
  35.     PrintIADSObject()       -   Calls all the methods on a IADs object 
  36.                                 and prints them the console window
  37.     Parameters
  38.     
  39.         IADs * pIADs        - IADs Interface from which to retrieve attribute values
  40. */
  41. void PrintIADSObject(IADs * pIADs)
  42. {
  43.     assert(pIADs);
  44.  
  45.     BSTR bsResult;
  46.  
  47.     pIADs->get_Name(&bsResult); 
  48.     wprintf(L" NAME: %s\n",(LPOLESTR) bsResult);
  49.     SysFreeString(bsResult);
  50.     
  51.     pIADs->get_Class(&bsResult); 
  52.     wprintf(L" CLASS: %s\n",(LPOLESTR) bsResult);
  53.     SysFreeString(bsResult);
  54.     
  55.     pIADs->get_GUID(&bsResult); 
  56.     wprintf(L" GUID: %s\n",(LPOLESTR) bsResult);
  57.     SysFreeString(bsResult);
  58.     
  59.     pIADs->get_ADsPath(&bsResult); 
  60.     wprintf(L" ADSPATH: %s\n",(LPOLESTR) bsResult);
  61.     SysFreeString(bsResult);
  62.     
  63.     pIADs->get_Parent(&bsResult); 
  64.     wprintf(L" PARENT: %s\n",(LPOLESTR) bsResult);
  65.     SysFreeString(bsResult);
  66.     
  67.     pIADs->get_Schema(&bsResult); 
  68.     wprintf(L" SCHEMA: %s\n",(LPOLESTR) bsResult);
  69.     SysFreeString(bsResult);
  70.     
  71. }
  72.  
  73. ////////////////////////////////////////////////////////////////////////////////////////////////////
  74. ////////////////////////////////////////////////////////////////////////////////////////////////////
  75. ////////////////////////////////////////////////////////////////////////////////////////////////////
  76. ////////////////////////////////////////////////////////////////////////////////////////////////////
  77. ////////////////////////////////////////////////////////////////////////////////////////////////////
  78. // Error Handling routines
  79.  
  80. // Will display ADSI or COM error messages
  81. // when passed a BAD Hresult
  82. void CheckADHRESULT(HRESULT passedhr,LPOLESTR pwReason)
  83. {
  84.     if (SUCCEEDED(passedhr))
  85.         return;
  86.  
  87.     HRESULT hr;
  88.     DWORD lError;
  89.     WCHAR pwErrBuff[2048];
  90.     WCHAR pwADErrBuff[512];
  91.  
  92.     WCHAR * pADErrCodeStr;
  93.     
  94.     pwErrBuff[0] = NULL;
  95.     pADErrCodeStr = CrackADError( passedhr);
  96.  
  97.     // If an ADSI error code was returned, display it
  98.     if (pADErrCodeStr[0] != NULL)
  99.     {
  100.         wcscat(pwErrBuff,L"<*> ADSI Error HRESULT Returns: <*> \n");
  101.         wcscat(pwErrBuff,pADErrCodeStr);
  102.         wcscat(pwErrBuff,L"\n");
  103.     }           
  104.     
  105.     // Call ADsGetLastError() to retrieve the error text from ADSI
  106.     wcscat(pwErrBuff,L"<*> ADSI Error: <*>\n");
  107.     
  108.     hr = ADsGetLastError(
  109.         &lError,
  110.         pwADErrBuff,
  111.         2047,
  112.         L"",
  113.         0
  114.         );
  115.  
  116.  
  117.     if (FAILED(hr))
  118.         wcscat(pwErrBuff,L"<Unable to retrieve ADs Error>");
  119.     else
  120.         wcscat(pwErrBuff,pwADErrBuff);
  121.  
  122.     wcscat(pwErrBuff,L"\n");
  123.     
  124.     WCHAR sz[1024];
  125.     
  126.     wcscat(pwErrBuff,L"<*> System Error: <*> \n");
  127.  
  128.     // Check the standard system to crack the bad HRESULT into a string
  129.     if (!FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM, 0, passedhr, 0, sz, 1024, 0))
  130.         wcscat(sz, L"Unknown HRESULT error");
  131.     else
  132.         wcscat(pwErrBuff, sz);
  133.         
  134.     // Display
  135.     OutputDebugStringW(pwErrBuff);
  136.     OutputDebugStringW(L"\r\n");
  137.     _putws(L"\n**********");
  138.     wprintf(L"\nERROR on %s\n\n",pwReason);
  139.     _putws(pwErrBuff);
  140.     _putws(L"\n**********");
  141.     
  142. }
  143.  
  144. WCHAR * CrackADError(HRESULT hResult)
  145. {
  146.    static WCHAR szwText[ 128 ];
  147.    szwText[0] = 0l;
  148.  
  149.    switch( hResult )
  150.    {
  151.       case  E_ADS_BAD_PATHNAME:
  152.          return L"E_ADS_BAD_PATHNAME";
  153.          break;
  154.  
  155.       case  E_ADS_INVALID_DOMAIN_OBJECT:
  156.          return L"E_ADS_INVALID_DOMAIN_OBJECT";
  157.          break;
  158.  
  159.       case  E_ADS_INVALID_USER_OBJECT:
  160.          return L"E_ADS_INVALID_USER_OBJECT";
  161.          break;
  162.  
  163.       case  E_ADS_INVALID_COMPUTER_OBJECT:
  164.          return L"E_ADS_INVALID_COMPUTER_OBJECT";
  165.          break;
  166.  
  167.       case  E_ADS_UNKNOWN_OBJECT:
  168.          return L"E_ADS_UNKNOWN_OBJECT";
  169.          break;
  170.  
  171.       case  E_ADS_PROPERTY_NOT_SET:
  172.          return L"E_ADS_PROPERTY_NOT_SET";
  173.          break;
  174.  
  175.       case  E_ADS_PROPERTY_NOT_SUPPORTED:
  176.          return L"E_ADS_PROPERTY_NOT_SUPPORTED";
  177.          break;
  178.  
  179.       case  E_ADS_PROPERTY_INVALID:
  180.          return L"E_ADS_PROPERTY_INVALID";
  181.          break;
  182.  
  183.       case  E_ADS_BAD_PARAMETER:
  184.          return L"E_ADS_BAD_PARAMETER";
  185.          break;
  186.  
  187.       case  E_ADS_OBJECT_UNBOUND:
  188.          return L"E_ADS_OBJECT_UNBOUND";
  189.          break;
  190.  
  191.       case  E_ADS_PROPERTY_NOT_MODIFIED:
  192.          return L"E_ADS_PROPERTY_NOT_MODIFIED";
  193.          break;
  194.  
  195.       case  E_ADS_PROPERTY_MODIFIED:
  196.          return L"E_ADS_PROPERTY_MODIFIED";
  197.          break;
  198.  
  199.       case  E_ADS_CANT_CONVERT_DATATYPE:
  200.          return L"E_ADS_CANT_CONVERT_DATATYPE";
  201.          break;
  202.  
  203.       case  E_ADS_PROPERTY_NOT_FOUND:
  204.          return L"E_ADS_PROPERTY_NOTFOUND";
  205.          break;
  206.  
  207.       case  E_ADS_OBJECT_EXISTS:
  208.          return L"E_ADS_OBJECT_EXISTS";
  209.          break;
  210.  
  211.       case  E_ADS_SCHEMA_VIOLATION:
  212.          return L"E_ADS_SCHEMA_VIOLATION";
  213.          break;
  214.  
  215.       case  E_ADS_COLUMN_NOT_SET:
  216.          return L"E_ADS_COLUMN_NOT_SET";
  217.          break;
  218.  
  219.       case  E_ADS_INVALID_FILTER:
  220.          return L"E_ADS_INVALID_FILTER";
  221.          break;
  222.  
  223.       //case  E_ADS_LDAP_BASE:
  224.       //   return L"E_ADS_LDAP_BASE";
  225.       //   break;
  226.  
  227.       case  HRESULT_FROM_WIN32(ERROR_DS_OPERATIONS_ERROR):
  228.          return L"ERROR_DS_OPERATIONS_ERROR";
  229.          break;
  230.  
  231.       case  HRESULT_FROM_WIN32(ERROR_DS_PROTOCOL_ERROR):
  232.          return L"ERROR_DS_PROTOCOL_ERROR";
  233.          break;
  234.  
  235.       case  HRESULT_FROM_WIN32(ERROR_DS_TIMELIMIT_EXCEEDED):
  236.          return L"ERROR_DS_TIMELIMIT_EXCEEDED";
  237.          break;
  238.  
  239.       case  HRESULT_FROM_WIN32(ERROR_DS_SIZELIMIT_EXCEEDED):
  240.          return L"ERROR_DS_SIZELIMIT_EXCEEDED";
  241.          break;
  242.  
  243.       case  HRESULT_FROM_WIN32(ERROR_DS_COMPARE_FALSE):
  244.          return L"ERROR_DS_COMPARE_FALSE";
  245.          break;
  246.  
  247.  
  248.       case  HRESULT_FROM_WIN32(ERROR_DS_COMPARE_TRUE):
  249.          return L"ERROR_DS_COMPARE_TRUE";
  250.          break;
  251.  
  252.  
  253.       case  HRESULT_FROM_WIN32(ERROR_DS_AUTH_METHOD_NOT_SUPPORTED):
  254.          return L"ERROR_DS_AUTH_METHOD_NOT_SUPPORTED";
  255.          break;
  256.  
  257.  
  258.       case  HRESULT_FROM_WIN32(ERROR_DS_STRONG_AUTH_REQUIRED):
  259.          return L"ERROR_DS_STRONG_AUTH_REQUIRED";
  260.          break;
  261.  
  262.  
  263.       case  HRESULT_FROM_WIN32(ERROR_MORE_DATA):
  264.          return L"ERROR_MORE_DATA";
  265.          break;
  266.  
  267.       case  HRESULT_FROM_WIN32(ERROR_DS_REFERRAL):
  268.          return L"(ERROR_DS_REFERRAL";
  269.          break;
  270.  
  271.       case  HRESULT_FROM_WIN32(ERROR_DS_ADMIN_LIMIT_EXCEEDED):
  272.          return L"ERROR_DS_ADMIN_LIMIT_EXCEEDED";
  273.          break;
  274.  
  275.  
  276.       case  HRESULT_FROM_WIN32(ERROR_DS_UNAVAILABLE_CRIT_EXTENSION):
  277.          return L"(ERROR_DS_UNAVAILABLE_CRIT_EXTENSION";
  278.          break;
  279.  
  280.       case  HRESULT_FROM_WIN32(ERROR_DS_CONFIDENTIALITY_REQUIRED):
  281.          return L"HRESULT_FROM_WIN32(ERROR_DS_CONFIDENTIALITY_REQUIRED";
  282.          break;
  283.  
  284.       case  HRESULT_FROM_WIN32(ERROR_DS_NO_ATTRIBUTE_OR_VALUE):
  285.          return L"ERROR_DS_NO_ATTRIBUTE_OR_VALUE";
  286.          break;
  287.  
  288.       case  HRESULT_FROM_WIN32(ERROR_DS_ATTRIBUTE_TYPE_UNDEFINED):
  289.          return L"(ERROR_DS_ATTRIBUTE_TYPE_UNDEFINED";
  290.          break;
  291.  
  292.       case  HRESULT_FROM_WIN32(ERROR_DS_INAPPROPRIATE_MATCHING):
  293.          return L"(ERROR_DS_INAPPROPRIATE_MATCHING";
  294.          break;
  295.  
  296.       case  HRESULT_FROM_WIN32(ERROR_DS_CONSTRAINT_VIOLATION):
  297.          return L"ERROR_DS_CONSTRAINT_VIOLATION";
  298.          break;
  299.  
  300.       case  HRESULT_FROM_WIN32(ERROR_DS_ATTRIBUTE_OR_VALUE_EXISTS):
  301.          return L"ERROR_DS_ATTRIBUTE_OR_VALUE_EXISTS";
  302.          break;
  303.  
  304.       case  HRESULT_FROM_WIN32(ERROR_DS_INVALID_ATTRIBUTE_SYNTAX):
  305.          return L"ERROR_DS_INVALID_ATTRIBUTE_SYNTAX";
  306.          break;
  307.  
  308.       case  HRESULT_FROM_WIN32(ERROR_DS_NO_SUCH_OBJECT):
  309.          return L"ERROR_DS_NO_SUCH_OBJECT";
  310.          break;
  311.  
  312.       // case  HRESULT_FROM_WIN32(E_ADS_LDAP_ALIAS_PROBLEM:
  313.          // return L"HRESULT_FROM_WIN32(E_ADS_LDAP_ALIAS_PROBLEM";
  314.          // break;
  315.  
  316.       case  HRESULT_FROM_WIN32(ERROR_DS_INVALID_DN_SYNTAX):
  317.          return L"ERROR_DS_INVALID_DN_SYNTAX";
  318.          break;
  319.  
  320.       case  HRESULT_FROM_WIN32(ERROR_DS_IS_LEAF):
  321.          return L"ERROR_DS_IS_LEAF";
  322.          break;
  323.  
  324.       case  HRESULT_FROM_WIN32(ERROR_DS_ALIAS_DEREF_PROBLEM):
  325.          return L"ERROR_DS_ALIAS_DEREF_PROBLEM";
  326.          break;
  327.  
  328.       case  HRESULT_FROM_WIN32(ERROR_DS_INAPPROPRIATE_AUTH):
  329.          return L"ERROR_DS_INAPPROPRIATE_AUTH";
  330.          break;
  331.  
  332.       case  HRESULT_FROM_WIN32(ERROR_INVALID_PASSWORD):
  333.          return L"ERROR_INVALID_PASSWORD";
  334.          break;
  335.  
  336.       case  HRESULT_FROM_WIN32(ERROR_ACCESS_DENIED):
  337.          return L"ERROR_ACCESS_DENIED";
  338.          break;
  339.  
  340.       case  HRESULT_FROM_WIN32(ERROR_DS_BUSY):
  341.          return L"ERROR_DS_BUSY";
  342.          break;
  343.  
  344.       case  HRESULT_FROM_WIN32(ERROR_DS_UNAVAILABLE):
  345.          return L"ERROR_DS_UNAVAILABLE";
  346.          break;
  347.  
  348.       case  HRESULT_FROM_WIN32(ERROR_DS_UNWILLING_TO_PERFORM):
  349.          return L"ERROR_DS_UNWILLING_TO_PERFORM";
  350.          break;
  351.  
  352.       case  HRESULT_FROM_WIN32(ERROR_DS_LOOP_DETECT):
  353.          return L"ERROR_DS_LOOP_DETECT";
  354.          break;
  355.  
  356.       case  HRESULT_FROM_WIN32(ERROR_DS_NAMING_VIOLATION):
  357.          return L"ERROR_DS_NAMING_VIOLATION";
  358.          break;
  359.  
  360.       case  HRESULT_FROM_WIN32(ERROR_DS_OBJ_CLASS_VIOLATION):
  361.          return L"ERROR_DS_OBJ_CLASS_VIOLATION";
  362.          break;
  363.  
  364.       case  HRESULT_FROM_WIN32(ERROR_DS_CANT_ON_NON_LEAF):
  365.          return L"ERROR_DS_CANT_ON_NONLEAF";
  366.          break;
  367.  
  368.       case  HRESULT_FROM_WIN32(ERROR_DS_CANT_ON_RDN):
  369.          return L"ERROR_DS_CANT_ON_RDN";
  370.          break;
  371.  
  372.       case  HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS):
  373.          return L"ERROR_ALREADY_EXISTS";
  374.          break;
  375.  
  376.       case  HRESULT_FROM_WIN32(ERROR_DS_CANT_MOD_OBJ_CLASS):
  377.          return L"ERROR_DS_CANT_MOD_OBJ_CLASS";
  378.          break;
  379.  
  380.       case  HRESULT_FROM_WIN32(ERROR_DS_OBJECT_RESULTS_TOO_LARGE):
  381.          return L"ERROR_DS_OBJECT_RESULTS_TOO_LARGE";
  382.          break;
  383.  
  384.       case  HRESULT_FROM_WIN32(ERROR_DS_AFFECTS_MULTIPLE_DSAS):
  385.          return L"ERROR_DS_AFFECTS_MULTIPLE_DSAS";
  386.          break;
  387.  
  388.       case  HRESULT_FROM_WIN32(ERROR_GEN_FAILURE):
  389.          return L"(ERROR_GEN_FAILURE";
  390.          break;
  391.  
  392.       case  HRESULT_FROM_WIN32(ERROR_DS_SERVER_DOWN):
  393.          return L"ERROR_DS_SERVER_DOWN";
  394.          break;
  395.  
  396.       case  HRESULT_FROM_WIN32(ERROR_DS_LOCAL_ERROR):
  397.          return L"ERROR_DS_LOCAL_ERROR";
  398.          break;
  399.  
  400.       case  HRESULT_FROM_WIN32(ERROR_DS_ENCODING_ERROR):
  401.          return L"ERROR_DS_ENCODING_ERROR";
  402.          break;
  403.  
  404.       case  HRESULT_FROM_WIN32(ERROR_DS_DECODING_ERROR):
  405.          return L"(ERROR_DS_DECODING_ERROR";
  406.          break;
  407.  
  408.       case  HRESULT_FROM_WIN32(ERROR_TIMEOUT):
  409.          return L"(ERROR_TIMEOUT";
  410.          break;
  411.  
  412.       case  HRESULT_FROM_WIN32(ERROR_DS_AUTH_UNKNOWN):
  413.          return L"ERROR_DS_AUTH_UNKNOWN";
  414.          break;
  415.  
  416.       case  HRESULT_FROM_WIN32(ERROR_DS_FILTER_UNKNOWN):
  417.          return L"(ERROR_DS_FILTER_UNKNOWN";
  418.          break;
  419.  
  420.       case  HRESULT_FROM_WIN32(ERROR_CANCELLED):
  421.          return L"(ERROR_CANCELLED";
  422.          break;
  423.  
  424.       case  HRESULT_FROM_WIN32(ERROR_DS_PARAM_ERROR):
  425.          return L"ERROR_DS_PARAM_ERROR";
  426.          break;
  427.  
  428.       case  HRESULT_FROM_WIN32(ERROR_NOT_ENOUGH_MEMORY):
  429.          return L"ERROR_NOT_ENOUGH_MEMORY";
  430.          break;
  431.  
  432.       case  HRESULT_FROM_WIN32(ERROR_CONNECTION_REFUSED):
  433.          return L"ERROR_CONNECTION_REFUSED";
  434.          break;
  435.  
  436.       case  HRESULT_FROM_WIN32(ERROR_DS_NOT_SUPPORTED):
  437.          return L"ERROR_DS_NOT_SUPPORTED";
  438.          break;
  439.  
  440.       case  HRESULT_FROM_WIN32(ERROR_DS_NO_RESULTS_RETURNED):
  441.          return L"ERROR_DS_NO_RESULTS_RETURNED";
  442.          break;
  443.  
  444.       case  HRESULT_FROM_WIN32(ERROR_DS_CONTROL_NOT_FOUND):
  445.          return L"ERROR_DS_CONTROL_NOT_FOUND";
  446.          break;
  447.  
  448.       // case  HRESULT_FROM_WIN32(E_ADS_LDAP_MORE_RESULTS_TO_RETURN:
  449.          // return L"HRESULT_FROM_WIN32(E_ADS_LDAP_MORE_RESULTS_TO_RETURN";
  450.          // break;
  451.  
  452.       case  HRESULT_FROM_WIN32(ERROR_DS_CLIENT_LOOP):
  453.          return L"(ERROR_DS_CLIENT_LOOP";
  454.          break;
  455.  
  456.       case  HRESULT_FROM_WIN32(ERROR_DS_REFERRAL_LIMIT_EXCEEDED):
  457.          return L"ERROR_DS_REFERRAL_LIMIT_EXCEEDED";
  458.          break;
  459.  
  460.       // case  HRESULT_FROM_WIN32(E_ADS_LDAP_LAST:
  461.          // return L"HRESULT_FROM_WIN32(E_ADS_LDAP_LAST";
  462.          // break;
  463.  
  464.       case  E_FAIL:
  465.          return L"E_FAIL";
  466.          break;
  467.  
  468.       case  E_NOTIMPL:
  469.          return L"E_NOIMPL";
  470.          break;
  471.  
  472.       case  S_OK:
  473.          return L"OK";
  474.          break;
  475.  
  476.       case  0x800704b8:
  477.       // we have an extended error
  478.       {
  479.          WCHAR szErrorBuff[ 1024 ];
  480.          WCHAR szNameBuff[ 1024 ];
  481.          DWORD dwError;
  482.  
  483.          ADsGetLastError( &dwError,
  484.                           szErrorBuff,
  485.                           1023,
  486.                           szNameBuff,
  487.                           1023 );
  488.          wcscat( szNameBuff, L" : " );
  489.          wcscat( szNameBuff, szErrorBuff );
  490.          wcscpy( szwText,szNameBuff);
  491.  
  492.          return szwText;
  493.       }
  494.  
  495.    }
  496.  
  497.     return szwText; 
  498. }
  499.  
  500.  
  501.