/***************************************************************************** Copyright information : Copyright (c) 1998-1999 Microsoft Corporation File Name : CmdAlias.cpp Project Name : WMI Command Line Author Name : Ch. Sriramachandramurthy Date of Creation (dd/mm/yy) : 27th-September-2000 Version Number : 1.0 Brief Description : The CmdAlias class encapsulates the functionality for retrieving alias information. Revision History : Last Modified By : C V Nandi Last Modified Date : 16th-March-2001 *****************************************************************************/ #include "Precomp.h" #include "GlobalSwitches.h" #include "CommandSwitches.h" #include "HelpInfo.h" #include "ErrorLog.h" #include "ParsedInfo.h" #include "CmdAlias.h" #include "CmdTokenizer.h" #include "ErrorInfo.h" #include "WMICliXMLLog.h" #include "ParserEngine.h" #include "ExecEngine.h" #include "FormatEngine.h" #include "WmiCmdLn.h" /*---------------------------------------------------------------------------- Name :CCmdAlias Synopsis :This function initializes the member variables when an object of the class type is instantiated. Type :Constructor Input parameter :None Output parameters :None Return Type :None Global Variables :None Calling Syntax :None Notes :None ----------------------------------------------------------------------------*/ CCmdAlias::CCmdAlias() { m_pIAliasNS = NULL; m_pILocalizedNS = NULL; m_bTrace = FALSE; m_eloErrLogOpt = NO_LOGGING; } /*---------------------------------------------------------------------------- Name :~CCmdAlias Synopsis :This function uninitializes the member variables when an object of the class type goes out of scope. Type :Destructor Input parameter :None Output parameters :None Return Type :None Global Variables :None Calling Syntax :None Notes :None ----------------------------------------------------------------------------*/ CCmdAlias::~CCmdAlias() { SAFEIRELEASE(m_pIAliasNS); SAFEIRELEASE(m_pILocalizedNS); } /*---------------------------------------------------------------------------- Name :Uninitialize Synopsis :This function uninitializes the member variables when the execution of a command string issued on the command line is completed. Type :Member Function Input Parameter(s): bFinal - boolean value which when set indicates that the program Output parameters :None Return Type :None Global Variables :None Calling Syntax :Uninitialize(bFinal) Notes :None ----------------------------------------------------------------------------*/ void CCmdAlias::Uninitialize(BOOL bFinal) { m_bTrace = FALSE; // If end of program if (bFinal) { SAFEIRELEASE(m_pILocalizedNS); SAFEIRELEASE(m_pIAliasNS); } } /*---------------------------------------------------------------------------- Name :ConnectToAlias Synopsis :This function connects to WMI namespace on the specified machine using the information available CParsedInfo class object. Type :Member Function Input parameter(s): rParsedInfo - reference to CParsedInfo class object. pIWbemLocator - IWbemLocator object for connecting to WMI . Output parameter(s): rParsedInfo - reference to CParsedInfo class object. Return Type :HRESULT Global Variables :None Calling Syntax :ConnectToAlias(rParsedInfo,pIWbemLocator) Notes :None ----------------------------------------------------------------------------*/ HRESULT CCmdAlias::ConnectToAlias(CParsedInfo& rParsedInfo, IWbemLocator* pIWbemLocator) { // Get current thread for logging the success or failure of the command. DWORD dwThreadId = GetCurrentThreadId(); HRESULT hr = S_OK; // Set the trace flag m_bTrace = rParsedInfo.GetGlblSwitchesObject().GetTraceStatus(); m_eloErrLogOpt = rParsedInfo.GetErrorLogObject().GetErrLogOption(); try { // If the /ROLE has been changed since last invocation if (rParsedInfo.GetGlblSwitchesObject().GetRoleFlag() == TRUE) { SAFEIRELEASE(m_pIAliasNS); CHString chsMsg; // Connect to the specified namespace of Windows Management on the // local computer using the locator object. hr = Connect(pIWbemLocator, &m_pIAliasNS, _bstr_t(rParsedInfo.GetGlblSwitchesObject().GetRole()), NULL, NULL, _bstr_t(rParsedInfo.GetGlblSwitchesObject(). GetLocale()), rParsedInfo); // If /TRACE is ON if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format( L"IWbemLocator::ConnectServer(L\"%s\", NULL, NULL, " L"L\"%s\", 0L, NULL, NULL, -)", rParsedInfo.GetGlblSwitchesObject().GetRole(), rParsedInfo.GetGlblSwitchesObject().GetLocale()); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace); } ONFAILTHROWERROR(hr); // Set the interface level security hr = SetSecurity(m_pIAliasNS, NULL, NULL, NULL, NULL, rParsedInfo.GetGlblSwitchesObject().GetAuthenticationLevel(), rParsedInfo.GetGlblSwitchesObject().GetImpersonationLevel()); // If /TRACE is ON if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format(L"CoSetProxyBlanket(-, RPC_C_AUTHN_WINNT, " L"RPC_C_AUTHZ_NONE, NULL, %d, %d, -, EOAC_NONE)", rParsedInfo.GetGlblSwitchesObject().GetAuthenticationLevel(), rParsedInfo.GetGlblSwitchesObject().GetImpersonationLevel()); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace); } ONFAILTHROWERROR(hr); rParsedInfo.GetGlblSwitchesObject().SetRoleFlag(FALSE); } // Connect to the localized Namespace hr = ConnectToLocalizedNS(rParsedInfo, pIWbemLocator); ONFAILTHROWERROR(hr); } catch(_com_error& e) { // Set the COM error rParsedInfo.GetCmdSwitchesObject().SetCOMError(e); hr = e.Error(); } catch(CHeap_Exception) { hr = WBEM_E_OUT_OF_MEMORY; _com_issue_error(hr); } return hr; } /*---------------------------------------------------------------------------- Name :ObtainAliasInfo Synopsis :Obtains the following info of the alias specified. 1. alias PWhere expression 2. alias target string 3. alias description from the alias definition and updates the information in the CParsedInfo object passed as reference. Type :Member Function Input parameter(s): rParsedInfo - The parsed info from command line input. Output parameter(s): rParsedInfo - The parsed info from command line input. Return Type :RETCODE Global Variables :None Calling Syntax :ObtainAliasInfo(rParsedInfo) Notes :None ----------------------------------------------------------------------------*/ RETCODE CCmdAlias::ObtainAliasInfo(CParsedInfo& rParsedInfo) { // Variables being used in this function. IWbemClassObject *pIWbemObj = NULL; IUnknown *pIUnknown = NULL; IWbemClassObject *pIEmbedObj = NULL; HRESULT hr = S_OK; RETCODE retCode = PARSER_CONTINUE; DWORD dwThreadId = GetCurrentThreadId(); // Variants to save the properties and also for the embedded objects. VARIANT vtProp, vtEmbedProp; VariantInit(&vtProp); VariantInit(&vtEmbedProp); try { _bstr_t bstrResult; CHString chsMsg; // Object path of the required alias. _bstr_t bstrPath = _bstr_t("MSFT_CliAlias.FriendlyName='") + _bstr_t(rParsedInfo.GetCmdSwitchesObject(). GetAliasName()) + _bstr_t(L"'"); //Retrieving the object from the namespace in m_pIAliasNS hr = m_pIAliasNS->GetObject(bstrPath, 0, NULL, &pIWbemObj, NULL); if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format(L"IWbemServices::GetObject(L\"%s\", 0, NULL, -)", (WCHAR*) bstrPath); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace); } // To set errata code that indicates a more user friendly error // message to the user. if ( FAILED ( hr ) ) { // Don't set com error in catch block. rParsedInfo.GetCmdSwitchesObject().SetErrataCode( IDS_E_ALIAS_NOT_FOUND); } ONFAILTHROWERROR(hr); //1. Retrieve the value of 'Target' property object hr = pIWbemObj->Get(_bstr_t(L"Target"), 0, &vtProp, 0, 0 ); if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format(L"IWbemClassObject::Get(L\"Target\", 0, -, 0, 0)"); GetBstrTFromVariant(vtProp, bstrResult); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace, 0, bstrResult); } ONFAILTHROWERROR(hr); if (vtProp.vt != VT_NULL && vtProp.vt != VT_EMPTY) { if(!rParsedInfo.GetCmdSwitchesObject().SetAliasTarget( (_TCHAR*)vtProp.bstrVal)) { rParsedInfo.GetCmdSwitchesObject(). SetErrataCode(OUT_OF_MEMORY); retCode = PARSER_OUTOFMEMORY; } } if(retCode != PARSER_OUTOFMEMORY) { VARIANTCLEAR(vtProp); //2. Retrieve the value of 'PWhere' property object VariantInit(&vtProp); hr = pIWbemObj->Get(_bstr_t(L"PWhere"), 0, &vtProp, 0, 0); if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format(L"IWbemClassObject::Get(L\"PWhere\", 0, -," L"0, 0)"); GetBstrTFromVariant(vtProp, bstrResult); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace, 0, bstrResult); } ONFAILTHROWERROR(hr); if (vtProp.vt != VT_NULL && vtProp.vt != VT_EMPTY) { if(!rParsedInfo.GetCmdSwitchesObject().SetPWhereExpr( (_TCHAR*)vtProp.bstrVal)) { rParsedInfo.GetCmdSwitchesObject(). SetErrataCode(OUT_OF_MEMORY); retCode = PARSER_OUTOFMEMORY; } } if(retCode != PARSER_OUTOFMEMORY) { VARIANTCLEAR(vtProp); // Retrieve the "Connection" property value VariantInit(&vtProp); hr = pIWbemObj->Get(_bstr_t(L"Connection"), 0, &vtProp, 0, 0); if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format(L"IWbemClassObject::Get(L\"Connection\"," L"0, -, 0, 0)"); GetBstrTFromVariant(vtProp, bstrResult); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace, 0, bstrResult); } ONFAILTHROWERROR(hr); if (vtProp.vt != VT_NULL && vtProp.vt != VT_EMPTY) { pIUnknown = vtProp.punkVal; hr = pIUnknown->QueryInterface(IID_IWbemClassObject, (void**)&pIEmbedObj); if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format(L"QueryInterface(" L"IID_IWbemClassObject, -)"); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace); } ONFAILTHROWERROR(hr); retCode = ObtainAliasConnectionInfo(rParsedInfo, pIEmbedObj); //Releasing the embedded object. SAFEIRELEASE(pIEmbedObj); VARIANTCLEAR(vtProp); } } } // Obtain the alias description if (retCode != PARSER_OUTOFMEMORY) { _bstr_t bstrDesc; hr = GetDescOfObject(pIWbemObj, bstrDesc, rParsedInfo, TRUE); ONFAILTHROWERROR(hr); if(!rParsedInfo.GetCmdSwitchesObject(). SetAliasDesc((_TCHAR*)bstrDesc)) { rParsedInfo.GetCmdSwitchesObject(). SetErrataCode(OUT_OF_MEMORY); retCode = PARSER_OUTOFMEMORY; } } SAFEIRELEASE(pIWbemObj); } catch(_com_error& e) { SAFEIRELEASE(pIWbemObj); SAFEIRELEASE(pIEmbedObj); VARIANTCLEAR(vtProp); VARIANTCLEAR(vtEmbedProp); // No errata code then set com error. if ( rParsedInfo.GetCmdSwitchesObject().GetErrataCode() == 0 ) rParsedInfo.GetCmdSwitchesObject().SetCOMError(e); retCode = PARSER_ERRMSG; } catch(CHeap_Exception) { SAFEIRELEASE(pIWbemObj); SAFEIRELEASE(pIEmbedObj); VARIANTCLEAR(vtProp); VARIANTCLEAR(vtEmbedProp); retCode = PARSER_ERRMSG; hr = WBEM_E_OUT_OF_MEMORY; _com_issue_error(hr); } return retCode; } /*---------------------------------------------------------------------------- Name :ObtainAliasConnectionInfo Synopsis : Obtain the alias connection information like 1. namespace 2. user 3. password 4. locale 5. server 6. authority Type :Member Function Input parameter(s): rParsedInfo - The parsed info from command line input. pIEmbedObj - Pointer to the IWbem class object Output parameter(s): rParsedInfo - The parsed info from command line input. Return Type :RETCODE Global Variables :None Calling Syntax :ObtainAliasConnectionInfo(rParsedInfo) Notes :None ----------------------------------------------------------------------------*/ RETCODE CCmdAlias::ObtainAliasConnectionInfo(CParsedInfo& rParsedInfo, IWbemClassObject* pIEmbedObj) { RETCODE retCode = PARSER_CONTINUE; HRESULT hr = S_OK; UINT uConnFlag = 0; DWORD dwThreadId = GetCurrentThreadId(); VARIANT vtEmbedProp; VariantInit(&vtEmbedProp); uConnFlag = rParsedInfo.GetGlblSwitchesObject().GetConnInfoFlag(); try { CHString chsMsg; _bstr_t bstrResult; if (!(uConnFlag & NAMESPACE)) { // retrieve the value of 'Namespace' property hr = pIEmbedObj->Get(_bstr_t(L"Namespace"), 0, &vtEmbedProp, 0,0); if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format(L"IWbemClassObject::Get(L\"Namespace\", 0, -," L"0, 0)"); GetBstrTFromVariant(vtEmbedProp, bstrResult); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace, 0, bstrResult); } ONFAILTHROWERROR(hr); if (vtEmbedProp.vt != VT_NULL && vtEmbedProp.vt != VT_EMPTY) { if(!rParsedInfo.GetCmdSwitchesObject().SetAliasNamespace( (_TCHAR*)vtEmbedProp.bstrVal)) { rParsedInfo.GetCmdSwitchesObject(). SetErrataCode(OUT_OF_MEMORY); retCode = PARSER_OUTOFMEMORY; } VARIANTCLEAR(vtEmbedProp); } } if(retCode != PARSER_OUTOFMEMORY) { if (!(uConnFlag & LOCALE)) { // retrieve the value of 'Locale' property hr = pIEmbedObj->Get(_bstr_t(L"Locale"), 0, &vtEmbedProp,0,0); if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format(L"IWbemClassObject::Get(L\"Locale\", 0," L"-, 0, 0)"); GetBstrTFromVariant(vtEmbedProp, bstrResult); WMITRACEORERRORLOG(hr, __LINE__, __FILE__,(LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace, 0, bstrResult); } ONFAILTHROWERROR(hr); if (vtEmbedProp.vt != VT_NULL && vtEmbedProp.vt != VT_EMPTY) { if(!rParsedInfo.GetCmdSwitchesObject().SetAliasLocale( (_TCHAR*)vtEmbedProp.bstrVal)) { rParsedInfo.GetCmdSwitchesObject(). SetErrataCode(OUT_OF_MEMORY); retCode = PARSER_OUTOFMEMORY; } VARIANTCLEAR(vtEmbedProp); } } if(retCode != PARSER_OUTOFMEMORY) { if (!(uConnFlag & USER)) { // retrieve the value of 'User' property hr = pIEmbedObj->Get(_bstr_t(L"User"), 0, &vtEmbedProp, 0,0); if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format(L"IWbemClassObject::Get(L\"User\", 0," L"-, 0, 0)"); GetBstrTFromVariant(vtEmbedProp, bstrResult); WMITRACEORERRORLOG( hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace, 0, bstrResult ); } ONFAILTHROWERROR(hr); if (vtEmbedProp.vt != VT_NULL && vtEmbedProp.vt != VT_EMPTY) { if(!rParsedInfo.GetCmdSwitchesObject().SetAliasUser( (_TCHAR*)vtEmbedProp.bstrVal)) { rParsedInfo.GetCmdSwitchesObject(). SetErrataCode(OUT_OF_MEMORY); retCode = PARSER_OUTOFMEMORY; } VARIANTCLEAR(vtEmbedProp); } } if(retCode != PARSER_OUTOFMEMORY) { if (!(uConnFlag & PASSWORD)) { // retrieve the value of 'Password' property hr = pIEmbedObj->Get(_bstr_t(L"Password"), 0, &vtEmbedProp, 0,0); if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format(L"IWbemClassObject::Get" L"(L\"Password\", 0, -, 0, 0)"); GetBstrTFromVariant(vtEmbedProp, bstrResult); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace, 0, bstrResult); } ONFAILTHROWERROR(hr); if (vtEmbedProp.vt != VT_NULL && vtEmbedProp.vt != VT_EMPTY) { if(!rParsedInfo.GetCmdSwitchesObject(). SetAliasPassword((_TCHAR*)vtEmbedProp.bstrVal)) { rParsedInfo.GetCmdSwitchesObject(). SetErrataCode(OUT_OF_MEMORY); retCode = PARSER_OUTOFMEMORY; } VARIANTCLEAR(vtEmbedProp); } } if(retCode != PARSER_OUTOFMEMORY) { if (!(uConnFlag & NODE)) { // retrieve the value of 'Server' property hr = pIEmbedObj->Get(_bstr_t(L"Server"), 0, &vtEmbedProp, 0,0); if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format(L"IWbemClassObject::Get" L"(L\"Server\", 0, -, 0, 0)"); GetBstrTFromVariant(vtEmbedProp, bstrResult); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg,dwThreadId, rParsedInfo, m_bTrace, 0, bstrResult); } ONFAILTHROWERROR(hr); if (vtEmbedProp.vt != VT_NULL && vtEmbedProp.vt != VT_EMPTY) { if(!rParsedInfo.GetCmdSwitchesObject(). SetAliasNode((_TCHAR*)vtEmbedProp.bstrVal)) { rParsedInfo.GetCmdSwitchesObject(). SetErrataCode(OUT_OF_MEMORY); retCode = PARSER_OUTOFMEMORY; } VARIANTCLEAR(vtEmbedProp); } } if (retCode != PARSER_OUTOFMEMORY) { // retrieve the value of 'Authority' property hr = pIEmbedObj->Get(_bstr_t(L"Authority"), 0, &vtEmbedProp, 0,0); if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format(L"IWbemClassObject::Get" L"(L\"Authority\", 0, -, 0, 0)"); GetBstrTFromVariant(vtEmbedProp, bstrResult); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg,dwThreadId, rParsedInfo, m_bTrace, 0, bstrResult); } ONFAILTHROWERROR(hr); if (vtEmbedProp.vt != VT_NULL && vtEmbedProp.vt != VT_EMPTY) { if(!rParsedInfo.GetGlblSwitchesObject(). SetAuthority((_TCHAR*)vtEmbedProp.bstrVal)) { rParsedInfo.GetCmdSwitchesObject(). SetErrataCode(OUT_OF_MEMORY); retCode = PARSER_OUTOFMEMORY; } VARIANTCLEAR(vtEmbedProp); } } } } } } } catch(_com_error& e) { rParsedInfo.GetCmdSwitchesObject().SetCOMError(e); retCode = PARSER_OUTOFMEMORY; VARIANTCLEAR(vtEmbedProp); } catch(CHeap_Exception) { retCode = PARSER_OUTOFMEMORY; VARIANTCLEAR(vtEmbedProp); hr = WBEM_E_OUT_OF_MEMORY; _com_issue_error(hr); } return retCode; } /*---------------------------------------------------------------------------- Name :ObtainAliasVerbDetails Synopsis :Obtains the verbs and their details associated with the alias object and updates the CCommandSwitches of CParsedInfo object passed to it. Type :Member Function Input parameter(s): rParsedInfo - The parsed info from command line input. Output parameter(s): rParsedInfo - The parsed info from command line input. Return Type :HRESULT Global Variables :None Calling Syntax :ObtainAliasVerbDetails(rParsedInfo) Notes :None ----------------------------------------------------------------------------*/ HRESULT CCmdAlias::ObtainAliasVerbDetails(CParsedInfo& rParsedInfo) { // variables being used in this function. IWbemClassObject *pIWbemObj = NULL; IWbemClassObject *pIEmbedObj = NULL; IWbemClassObject *pIEmbedObj2 = NULL; HRESULT hr = S_OK; _TCHAR szNumber[BUFFER512] = NULL_STRING; DWORD dwThreadId = GetCurrentThreadId(); VARIANT vtVerbs, vtVerbName, vtParameters, vtParaId, vtParaType, vtVerbType, vtVerbDerivation, vtDefaultParamValue; VariantInit(&vtVerbs); VariantInit(&vtVerbName); VariantInit(&vtParameters); VariantInit(&vtParaId); VariantInit(&vtParaType); VariantInit(&vtVerbType); VariantInit(&vtVerbDerivation); VariantInit(&vtDefaultParamValue); try { CHString chsMsg; _bstr_t bstrResult; // Initialize methDetMap each time. rParsedInfo.GetCmdSwitchesObject().GetMethDetMap().clear(); _bstr_t bstrPath = _bstr_t("MSFT_CliAlias.FriendlyName='") + _bstr_t(rParsedInfo.GetCmdSwitchesObject().GetAliasName())+ _bstr_t(L"'"); //Retrieving the object from the namespace in m_pIAliasNS hr = m_pIAliasNS->GetObject(bstrPath, 0, NULL, &pIWbemObj, NULL); if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format(L"IWbemServices::GetObject(L\"%s\", 0, NULL, -)", (WCHAR*) bstrPath); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace); } ONFAILTHROWERROR(hr); // Obtain verb name and method name to get info of verb name // or method name only if they are specified. _TCHAR* pVerbName = rParsedInfo.GetCmdSwitchesObject().GetVerbName(); _TCHAR* pMethodName = rParsedInfo.GetCmdSwitchesObject(). GetMethodName(); BOOL bCompareVerb = FALSE, bCompareMethod = FALSE; if ( pVerbName != NULL && CompareTokens(pVerbName,CLI_TOKEN_CALL) && pMethodName != NULL ) bCompareMethod = TRUE; else if ( pVerbName != NULL && !CompareTokens(pVerbName,CLI_TOKEN_CALL)) bCompareVerb = TRUE; // Get "Verbs" property. hr = pIWbemObj->Get(_bstr_t(L"Verbs"), 0, &vtVerbs, 0, 0) ; if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format(L"IWbemClassObject::Get(L\"Verbs\", 0, -, 0, 0)"); GetBstrTFromVariant(vtVerbs, bstrResult); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace, 0, bstrResult); } ONFAILTHROWERROR(hr); if ( vtVerbs.vt != VT_EMPTY && vtVerbs.vt != VT_NULL) { // Get lower and upper bounds of Verbs array LONG lUpper = 0, lLower = 0; hr = SafeArrayGetLBound(vtVerbs.parray, vtVerbs.parray->cDims, &lLower); if ( m_eloErrLogOpt ) { chsMsg.Format(L"SafeArrayGetLBound(-, -, -)"); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, FALSE); } ONFAILTHROWERROR(hr); hr = SafeArrayGetUBound(vtVerbs.parray, vtVerbs.parray->cDims, &lUpper); if ( m_eloErrLogOpt ) { chsMsg.Format(L"SafeArrayGetUBound(-, -, -)"); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, FALSE); } ONFAILTHROWERROR(hr); for (LONG lIndex = lLower; lIndex <= lUpper; lIndex++) { pIEmbedObj = NULL; // Get "Name" property. hr = SafeArrayGetElement(vtVerbs.parray,&lIndex,&pIEmbedObj); if ( m_eloErrLogOpt ) { chsMsg.Format(L"SafeArrayGetElement(-, -, -)"); WMITRACEORERRORLOG(hr, __LINE__, __FILE__,(LPCWSTR)chsMsg, dwThreadId, rParsedInfo, FALSE); } ONFAILTHROWERROR(hr); hr = pIEmbedObj->Get(_bstr_t(L"Name"),0,&vtVerbName,0,0); if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format(L"IWbemClassObject::Get(L\"Name\", 0, -," L"0, 0)"); GetBstrTFromVariant(vtVerbName, bstrResult); WMITRACEORERRORLOG(hr, __LINE__, __FILE__,(LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace, 0, bstrResult); } ONFAILTHROWERROR(hr); // if user defined verb or method is specified then get info // of only related to user defined or method name. BOOL bContinue = FALSE; if ( bCompareMethod == TRUE && !CompareTokens(pMethodName, (_TCHAR*)_bstr_t(vtVerbName.bstrVal) ) ) bContinue = TRUE; else if ( bCompareVerb == TRUE && !CompareTokens(pVerbName, (_TCHAR*)_bstr_t(vtVerbName.bstrVal))) bContinue = TRUE; if ( bContinue == TRUE ) { SAFEIRELEASE(pIEmbedObj); continue; } _bstr_t bstrDesc; hr = GetDescOfObject(pIEmbedObj, bstrDesc, rParsedInfo); ONFAILTHROWERROR(hr); // Obtaining the input parameters and thier type. // Get "Parameters" property. hr = pIEmbedObj->Get(_bstr_t(L"Parameters"), 0, &vtParameters, 0, 0); if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format(L"IWbemClassObject::Get(L\"Parameters\"," L"0, -, 0, 0)"); GetBstrTFromVariant(vtParameters, bstrResult); WMITRACEORERRORLOG(hr, __LINE__, __FILE__,(LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace, 0, bstrResult); } ONFAILTHROWERROR(hr); if ( vtVerbName.vt != VT_EMPTY && vtVerbName.vt != VT_NULL ) { if ( bCompareVerb == TRUE || bCompareMethod == TRUE) { // Get "VerbType" property. hr = pIEmbedObj->Get(_bstr_t(L"VerbType"), 0, &vtVerbType, 0, 0); if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format(L"IWbemClassObject::Get" L"(L\"VerbType\", 0, -, 0, 0)"); GetBstrTFromVariant(vtVerbType, bstrResult); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace, 0, bstrResult ); } ONFAILTHROWERROR(hr); if ( vtVerbType.vt == VT_I4 ) { rParsedInfo.GetCmdSwitchesObject().SetVerbType( VERBTYPE(V_I4(&vtVerbType))); } else { rParsedInfo.GetCmdSwitchesObject().SetVerbType( NONALIAS); } // Get "Derivation" property. hr = pIEmbedObj->Get(_bstr_t(L"Derivation"), 0, &vtVerbDerivation, 0, 0); if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format(L"IWbemClassObject::Get" L"(L\"Derivation\", 0, -, 0, 0)"); GetBstrTFromVariant(vtVerbDerivation, bstrResult); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace, 0, bstrResult); } ONFAILTHROWERROR(hr); if ( vtVerbDerivation.vt == VT_BSTR ) rParsedInfo.GetCmdSwitchesObject(). SetVerbDerivation( _bstr_t(vtVerbDerivation.bstrVal)); } METHODDETAILS mdMethDet; mdMethDet.Description = bstrDesc; if ( vtParameters.vt != VT_EMPTY && vtParameters.vt != VT_NULL ) { // Get lower and upper bounds of Descriptions array LONG lUpper = 0, lLower = 0; hr = SafeArrayGetLBound(vtParameters.parray, vtParameters.parray->cDims, &lLower); if ( m_eloErrLogOpt ) { chsMsg.Format(L"SafeArrayGetLBound(-, -, -)"); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, FALSE); } ONFAILTHROWERROR(hr); hr = SafeArrayGetUBound(vtParameters.parray, vtParameters.parray->cDims, &lUpper); if ( m_eloErrLogOpt ) { chsMsg.Format(L"SafeArrayGetUBound(-, -, -)"); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, FALSE); } ONFAILTHROWERROR(hr); for (LONG lIndex = lLower; lIndex <= lUpper; lIndex++) { hr = SafeArrayGetElement(vtParameters.parray, &lIndex, &pIEmbedObj2); if ( m_eloErrLogOpt ) { chsMsg.Format(L"SafeArrayGetElement(-, -, -)"); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg,dwThreadId, rParsedInfo, FALSE); } ONFAILTHROWERROR(hr); // Get "ParaId" property. hr = pIEmbedObj2->Get(_bstr_t(L"ParaId"), 0, &vtParaId, 0, 0); if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format(L"IWbemClassObject::Get" L"(L\"ParaId\", 0, -, 0, 0)"); GetBstrTFromVariant(vtParaId, bstrResult); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg,dwThreadId, rParsedInfo, m_bTrace, 0, bstrResult); } ONFAILTHROWERROR(hr); // Get "Type" property. hr = pIEmbedObj2->Get(_bstr_t(L"Type"), 0, &vtParaType, 0, 0); if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format(L"IWbemClassObject::Get" L"(L\"Type\", 0, -, 0, 0)"); GetBstrTFromVariant(vtParaType, bstrResult); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg,dwThreadId, rParsedInfo, m_bTrace, 0, bstrResult); } ONFAILTHROWERROR(hr); // Get "Default" property. hr = pIEmbedObj2->Get(_bstr_t(L"Default"), 0, &vtDefaultParamValue, 0, 0); if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format(L"IWbemClassObject::Get" L"(L\"Default\", 0, -, 0, 0)"); GetBstrTFromVariant(vtDefaultParamValue, bstrResult); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg,dwThreadId, rParsedInfo, m_bTrace, 0, bstrResult); } ONFAILTHROWERROR(hr); if ( vtParaId.vt != VT_EMPTY && vtParaId.vt != VT_NULL ) { PROPERTYDETAILS pdPropDet; pdPropDet.InOrOut = UNKNOWN; hr = GetQualifiers(pIEmbedObj2, pdPropDet, rParsedInfo); if ( vtParaType.vt == VT_BSTR ) pdPropDet.Type = vtParaType.bstrVal; else pdPropDet.Type = _bstr_t("Not Available"); if ( vtDefaultParamValue.vt == VT_BSTR ) pdPropDet.Default = vtDefaultParamValue. bstrVal; // Making bstrPropName begin with numbers to // maintain the order of method arguments in // map. while displaying remove numbers and // display the parameters in case of help only // Also for named paramlist and cmdline // utility processing. _bstr_t bstrNumberedPropName; if ( rParsedInfo.GetGlblSwitchesObject(). GetHelpFlag() || rParsedInfo.GetCmdSwitchesObject(). GetVerbType() == CMDLINE ) { _TCHAR szMsg[BUFFER512]; _ltot(lIndex, szNumber, 10); _stprintf(szMsg, _T("%-5s"), szNumber); bstrNumberedPropName = _bstr_t(szMsg) + _bstr_t(vtParaId.bstrVal); } else bstrNumberedPropName = _bstr_t(vtParaId.bstrVal); mdMethDet.Params.insert( PROPDETMAP::value_type( bstrNumberedPropName, pdPropDet)); } VARIANTCLEAR(vtParaId); VARIANTCLEAR(vtParaType); VARIANTCLEAR(vtDefaultParamValue); SAFEIRELEASE(pIEmbedObj2); } } rParsedInfo.GetCmdSwitchesObject().AddToMethDetMap (vtVerbName.bstrVal, mdMethDet); } VARIANTCLEAR(vtVerbName); VARIANTCLEAR(vtVerbType); VARIANTCLEAR(vtVerbDerivation); VARIANTCLEAR(vtParameters); SAFEIRELEASE(pIEmbedObj); if ( bCompareVerb == TRUE || bCompareMethod == TRUE) break; } } VARIANTCLEAR(vtVerbs); SAFEIRELEASE(pIWbemObj); } catch(_com_error& e) { SAFEIRELEASE(pIWbemObj); SAFEIRELEASE(pIEmbedObj); VARIANTCLEAR(vtVerbs); VARIANTCLEAR(vtVerbName); VARIANTCLEAR(vtVerbType); VARIANTCLEAR(vtVerbDerivation); VARIANTCLEAR(vtDefaultParamValue); hr = e.Error(); rParsedInfo.GetCmdSwitchesObject().SetCOMError(e); } catch(CHeap_Exception) { SAFEIRELEASE(pIWbemObj); SAFEIRELEASE(pIEmbedObj); VARIANTCLEAR(vtVerbs); VARIANTCLEAR(vtVerbName); VARIANTCLEAR(vtVerbType); VARIANTCLEAR(vtVerbDerivation); VARIANTCLEAR(vtDefaultParamValue); hr = WBEM_E_OUT_OF_MEMORY; _com_issue_error(hr); } return hr; } /*---------------------------------------------------------------------------- Name :ObtainAliasFriendlyNames Synopsis :Obtains all the Friendly Names and descriptions in the CmdAlias and updates it in the CCommandSwitches of CParsedInfo object passed to it. Type :Member Function Input parameter(s): rParsedInfo - The parsed info from command line input. Output parameter(s): rParsedInfo - The parsed info from command line input. Return Type :HRESULT Global Variables :None Calling Syntax :ObtainAliasFriendlyNames(rParsedInfo) Notes :None ----------------------------------------------------------------------------*/ HRESULT CCmdAlias::ObtainAliasFriendlyNames(CParsedInfo& rParsedInfo) { // variables being used in this function. HRESULT hr = S_OK; IEnumWbemClassObject *pIEnumObj = NULL; IWbemClassObject *pIWbemObj = NULL; DWORD dwThreadId = GetCurrentThreadId(); VARIANT vtName; VariantInit(&vtName); try { CHString chsMsg; _bstr_t bstrResult; // Get alias object hr = m_pIAliasNS->ExecQuery(_bstr_t(L"WQL"), _bstr_t(L"SELECT * FROM MSFT_CliAlias"), WBEM_FLAG_FORWARD_ONLY| WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pIEnumObj); if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format(L"IWbemServices::ExecQuery(L\"WQL\"," L"L\"SELECT * FROM MSFT_CliAlias\"," L"WBEM_FLAG_FORWARD_ONLY|WBEM_FLAG_RETURN_IMMEDIATELY," L"NULL, -)"); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace); } ONFAILTHROWERROR(hr); // Set the security hr = SetSecurity(pIEnumObj, NULL, NULL, NULL, NULL, rParsedInfo.GetGlblSwitchesObject().GetAuthenticationLevel(), rParsedInfo.GetGlblSwitchesObject().GetImpersonationLevel()); if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format( L"CoSetProxyBlanket(-, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE," L"NULL, %d, %d, -, EOAC_NONE)", rParsedInfo.GetGlblSwitchesObject().GetAuthenticationLevel(), rParsedInfo.GetGlblSwitchesObject().GetImpersonationLevel()); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace); } ONFAILTHROWERROR(hr); ULONG ulReturned = 0; // Obtain the object starting at the current position in the // enumeration and loop through the instance list. while(((hr=pIEnumObj->Next(WBEM_INFINITE,1,&pIWbemObj,&ulReturned))== S_OK) && (ulReturned == 1)) { VariantInit(&vtName); // Gets "FriendlyName" array property of alias object hr = pIWbemObj->Get(_bstr_t(L"FriendlyName"), 0, &vtName, 0, 0); if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format(L"IWbemClassObject::Get(L\"FriendlyName\", 0," L"-, 0, 0)"); GetBstrTFromVariant(vtName, bstrResult); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace, 0, bstrResult); } ONFAILTHROWERROR(hr); if (vtName.vt != VT_NULL && vtName.vt != VT_EMPTY) { _bstr_t bstrFriendlyName = vtName.bstrVal; _bstr_t bstrDesc; hr = GetDescOfObject(pIWbemObj, bstrDesc, rParsedInfo, TRUE); ONFAILTHROWERROR(hr); //Add the "FriendlyName" to FriendlyName Map rParsedInfo.GetCmdSwitchesObject(). AddToAlsFrnNmsOrTrnsTblMap(CharUpper(bstrFriendlyName) ,bstrDesc); } VARIANTCLEAR(vtName); SAFEIRELEASE(pIWbemObj); } SAFEIRELEASE(pIEnumObj); } catch(_com_error& e) { SAFEIRELEASE(pIEnumObj); SAFEIRELEASE(pIWbemObj); VARIANTCLEAR(vtName); hr = e.Error(); rParsedInfo.GetCmdSwitchesObject().SetCOMError(e); } catch(CHeap_Exception) { SAFEIRELEASE(pIEnumObj); SAFEIRELEASE(pIWbemObj); VARIANTCLEAR(vtName); hr = WBEM_E_OUT_OF_MEMORY; _com_issue_error(hr); } return hr; } /*---------------------------------------------------------------------------- Name :ObtainAliasFormat Synopsis :Obtains the Derivation of the properties for the Format associated with the alias object and updates the CCommandSwitches of CParsedInfo object passed to it. Type :Member Function Input parameter(s): rParsedInfo - The parsed info from command line input. Output parameter(s): rParsedInfo - The parsed info from command line input. Return Type :BOOL : TRUE - if valid format is not present FALSE - if invalid format Global Variables :None Calling Syntax :ObtainAliasFormat(rParsedInfo) Notes :If bCheckForListFrmsAvail == TRUE then functions checks only for availibilty of list formats with the alias. ----------------------------------------------------------------------------*/ BOOL CCmdAlias::ObtainAliasFormat(CParsedInfo& rParsedInfo, BOOL bCheckForListFrmsAvail) { // variables being used in this function. HRESULT hr = S_OK; IWbemClassObject *pIWbemObj = NULL; IWbemClassObject *pIEmbedObj = NULL; IWbemClassObject *pIEmbedObj2 = NULL; BOOL bExist = FALSE; DWORD dwThreadId = GetCurrentThreadId(); VARIANT vtFormats, vtFormatName, vtProperties, vtPropertyName, vtPropertyDerivation ; BOOL bHelp = rParsedInfo. GetGlblSwitchesObject(). GetHelpFlag(); // Initializing all Variants variables being used in this function. VariantInit(&vtFormats); VariantInit(&vtFormatName); VariantInit(&vtProperties); VariantInit(&vtPropertyName); VariantInit(&vtPropertyDerivation); try { CHString chsMsg; _bstr_t bstrResult; _bstr_t bstrPath = _bstr_t("MSFT_CliAlias.FriendlyName='") + _bstr_t(rParsedInfo.GetCmdSwitchesObject().GetAliasName())+ _bstr_t(L"'"); // Get alias object hr = m_pIAliasNS->GetObject(bstrPath, 0, NULL, &pIWbemObj, NULL); if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format(L"IWbemServices::GetObject(L\"%s\", 0, NULL, -)", (WCHAR*) bstrPath); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace); } ONFAILTHROWERROR(hr); // Get Formats array property of alias object hr = pIWbemObj->Get(_bstr_t(L"Formats"), 0, &vtFormats, 0, 0); if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format(L"IWbemClassObject::Get(L\"Formats\", 0, -,0, 0)"); GetBstrTFromVariant(vtFormats, bstrResult); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace, 0, bstrResult); } ONFAILTHROWERROR(hr); if ( vtFormats.vt != VT_NULL && vtFormats.vt != VT_EMPTY && bCheckForListFrmsAvail == FALSE) { // Get lower and upper bounds of Formats array LONG lUpper = 0, lLower = 0; hr = SafeArrayGetLBound(vtFormats.parray, vtFormats.parray->cDims, &lLower); if ( m_eloErrLogOpt ) { chsMsg.Format(L"SafeArrayGetLBound(-, -, -)"); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, FALSE); } ONFAILTHROWERROR(hr); hr = SafeArrayGetUBound(vtFormats.parray, vtFormats.parray->cDims, &lUpper); if ( m_eloErrLogOpt ) { chsMsg.Format(L"SafeArrayGetUBound(-, -, -)"); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, FALSE); } ONFAILTHROWERROR(hr); // Iterate through the Formats array property for (LONG lIndex = lLower; lIndex <= lUpper; lIndex++) { // Get this property. hr =SafeArrayGetElement(vtFormats.parray,&lIndex,&pIEmbedObj); if ( m_eloErrLogOpt ) { chsMsg.Format(L"SafeArrayGetElement(-, -, -)"); WMITRACEORERRORLOG(hr, __LINE__, __FILE__,(LPCWSTR)chsMsg, dwThreadId, rParsedInfo, FALSE); } ONFAILTHROWERROR(hr); hr = pIEmbedObj->Get(_bstr_t(L"Name"),0,&vtFormatName,0,0); if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format(L"IWbemClassObject::Get(L\"Name\", 0," L"-, 0, 0)"); GetBstrTFromVariant(vtFormatName, bstrResult); WMITRACEORERRORLOG(hr, __LINE__, __FILE__,(LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace, 0, bstrResult); } ONFAILTHROWERROR(hr); //Comparing the specified Format in the alias against the //formats available for the specified alias. if(CompareTokens(_bstr_t(rParsedInfo.GetCmdSwitchesObject(). GetListFormat()), _bstr_t(vtFormatName.bstrVal))) { bExist = TRUE; VARIANT vtFormat; VariantInit(&vtFormat); //Getting the "Format" property. hr = pIEmbedObj->Get(_bstr_t(L"Format"),0, &vtFormat, 0, 0); if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format( L"IWbemClassObject::Get(L\"Format\"," L"0, -, 0, 0)"); GetBstrTFromVariant(vtFormat, bstrResult); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace, 0, bstrResult); } ONFAILTHROWERROR(hr); if ( vtFormat.vt != VT_EMPTY && vtFormat.vt != VT_NULL ) { if (rParsedInfo.GetCmdSwitchesObject(). GetXSLTDetailsVector().empty()) { _bstr_t bstrFileName ; // If _T("") is the value, it should be treated as // equivalent to if (CompareTokens(vtFormat.bstrVal, _T(""))) { bstrFileName = _bstr_t(CLI_TOKEN_TABLE); } else { bstrFileName = _bstr_t(vtFormat.bstrVal); } g_wmiCmd.GetFileFromKey(bstrFileName, bstrFileName); XSLTDET xdXSLTDet; xdXSLTDet.FileName = bstrFileName; FrameFileAndAddToXSLTDetVector(xdXSLTDet, rParsedInfo); } } VariantClear(&vtFormat); //Getting the "Properties" property. hr=pIEmbedObj->Get(_bstr_t(L"Properties"), 0, &vtProperties, 0, 0); if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format(L"IWbemClassObject::Get(L\"Properties\"," L"0, -, 0, 0)"); GetBstrTFromVariant(vtProperties, bstrResult); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace, 0, bstrResult); } ONFAILTHROWERROR(hr); if ( vtProperties.vt != VT_NULL ) { LONG lILower = 0, lIUpper = 0; hr = SafeArrayGetLBound(vtProperties.parray, vtProperties.parray->cDims, &lILower); if ( m_eloErrLogOpt ) { chsMsg.Format(L"SafeArrayGetLBound(-, -, -)"); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, FALSE); } ONFAILTHROWERROR(hr); hr = SafeArrayGetUBound(vtProperties.parray, vtProperties.parray->cDims, &lIUpper); if ( m_eloErrLogOpt ) { chsMsg.Format(L"SafeArrayGetUBound(-, -, -)"); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, FALSE); } ONFAILTHROWERROR(hr); // Iterate through the Properties array property for(LONG lIIndex = lILower; lIIndex <= lIUpper; lIIndex++) { // Get this property. hr = SafeArrayGetElement(vtProperties.parray, &lIIndex, &pIEmbedObj2); if ( m_eloErrLogOpt ) { chsMsg.Format(L"SafeArrayGetElement(-, -, -)"); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, FALSE); } ONFAILTHROWERROR(hr); //Getting the "Name" property hr = pIEmbedObj2->Get(_bstr_t(L"Name"), 0, &vtPropertyName,0,0); if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format(L"IWbemClassObject::Get" L"(L\"Name\", 0, -, 0, 0)"); GetBstrTFromVariant(vtPropertyName, bstrResult); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace, 0, bstrResult); } ONFAILTHROWERROR(hr); //Getting the "Derivation" property hr = pIEmbedObj2->Get(_bstr_t(L"Derivation"), 0, &vtPropertyDerivation,0,0); if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format(L"IWbemClassObject::Get" L"(L\"Derivation\", 0, -, 0, 0)"); GetBstrTFromVariant(vtPropertyDerivation, bstrResult); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace, 0, bstrResult); } ONFAILTHROWERROR(hr); _bstr_t bstrPropName; if ( bHelp ) { if ( vtPropertyName.vt == VT_BSTR ) bstrPropName = vtPropertyName.bstrVal; } else { if ( vtPropertyDerivation.vt == VT_BSTR ) bstrPropName = vtPropertyDerivation.bstrVal; else if ( vtPropertyName.vt == VT_BSTR ) bstrPropName = vtPropertyName.bstrVal; } //Add propertyderivation to property list in // rParsedInfo if((!bstrPropName == FALSE) && !rParsedInfo.GetCmdSwitchesObject(). AddToPropertyList( (_TCHAR*)bstrPropName)) { rParsedInfo.GetCmdSwitchesObject(). SetErrataCode(OUT_OF_MEMORY); bExist = FALSE; VARIANTCLEAR(vtPropertyDerivation); break; } // Add propertyname to property list in // rParsedInfo only to avail information of Name // and Derivation of list properties for XML // logging. PROPERTYDETAILS pdPropDet; if ( vtPropertyDerivation.vt == VT_BSTR ) pdPropDet.Derivation = vtPropertyDerivation.bstrVal; else pdPropDet.Derivation = _bstr_t(TOKEN_NA); rParsedInfo.GetCmdSwitchesObject(). AddToPropDetMap( vtPropertyName.bstrVal, pdPropDet); VARIANTCLEAR(vtPropertyName); VARIANTCLEAR(vtPropertyDerivation); // Release pIEmbedObj2 SAFEIRELEASE(pIEmbedObj2); } } // Release memory held by vtProperties VARIANTCLEAR(vtProperties); // Free memory held by vtFormatName VARIANTCLEAR(vtFormatName); // Release pIEmbedObj SAFEIRELEASE(pIEmbedObj); break; } // Free memory held by vtFormatName VARIANTCLEAR(vtFormatName); // Release pIEmbedObj SAFEIRELEASE(pIEmbedObj); } // Release memory held by vtFormats VARIANTCLEAR(vtFormats); } else if ( vtFormats.vt != VT_NULL && vtFormats.vt != VT_EMPTY ) { bExist = TRUE; } // Release pIWbem object SAFEIRELEASE(pIWbemObj); } catch(_com_error& e) { SAFEIRELEASE(pIWbemObj); SAFEIRELEASE(pIEmbedObj); SAFEIRELEASE(pIEmbedObj2); VARIANTCLEAR(vtFormats); VARIANTCLEAR(vtFormatName); VARIANTCLEAR(vtProperties); VARIANTCLEAR(vtPropertyName); VARIANTCLEAR(vtPropertyDerivation); rParsedInfo.GetCmdSwitchesObject().SetCOMError(e); bExist = FALSE; } catch(CHeap_Exception) { SAFEIRELEASE(pIWbemObj); SAFEIRELEASE(pIEmbedObj); SAFEIRELEASE(pIEmbedObj2); VARIANTCLEAR(vtFormats); VARIANTCLEAR(vtFormatName); VARIANTCLEAR(vtProperties); VARIANTCLEAR(vtPropertyName); VARIANTCLEAR(vtPropertyDerivation); bExist = FALSE; hr = WBEM_E_OUT_OF_MEMORY; _com_issue_error(hr); } return bExist; } /*---------------------------------------------------------------------------- Name :ObtainAliasPropDetails Synopsis :Obtains the details of the properties for the Format associated with the alias object and updates the CCommandSwitches of CParsedInfo object passed to it. Type :Member Function Input parameter(s): rParsedInfo - The parsed info from command line input. Output parameter(s): rParsedInfo - The parsed info from command line input. Return Type :HRESULT Global Variables :None Calling Syntax :ObtainAliasPropDetails(rParsedInfo) Notes :pbCheckWritePropsAvailInAndOut == TRUE then function checks for availibility of properties and returns in the same pbCheckWritePropsAvailInAndOut parameter. pbCheckFULLPropsAvailInAndOut == TRUE then function checks for availibility of alias properties i.e in FULL list format. Imp : Any one of the input pointers can only be specified. ----------------------------------------------------------------------------*/ HRESULT CCmdAlias::ObtainAliasPropDetails(CParsedInfo& rParsedInfo, BOOL *pbCheckWritePropsAvailInAndOut, BOOL *pbCheckFULLPropsAvailInAndOut) { // variables being used in this function. HRESULT hr = S_OK; IWbemClassObject *pIWbemObj = NULL; IWbemClassObject *pIEmbedObj = NULL; IWbemClassObject *pIEmbedObj2 = NULL; BOOL bPropList = FALSE; _TCHAR *pszVerbName = NULL; DWORD dwThreadId = GetCurrentThreadId(); VARIANT vtFormats, vtFormatName, vtProperties, vtPropertyName, vtPropertyDerivation; // Initializing all Variants variables being used in this function. VariantInit(&vtFormats); VariantInit(&vtFormatName); VariantInit(&vtProperties); VariantInit(&vtPropertyName); VariantInit(&vtPropertyDerivation); CHARVECTOR cvPropList; if ( pbCheckWritePropsAvailInAndOut != NULL ) *pbCheckWritePropsAvailInAndOut = FALSE; if ( pbCheckFULLPropsAvailInAndOut != NULL ) *pbCheckFULLPropsAvailInAndOut = FALSE; try { CHString chsMsg; _bstr_t bstrResult; pszVerbName = rParsedInfo.GetCmdSwitchesObject().GetVerbName(); cvPropList = rParsedInfo.GetCmdSwitchesObject().GetPropertyList(); if ( cvPropList.size() != 0 ) bPropList = TRUE; _bstr_t bstrPath = _bstr_t("MSFT_CliAlias.FriendlyName='") + _bstr_t(rParsedInfo.GetCmdSwitchesObject().GetAliasName())+ _bstr_t(L"'"); // Get alias object hr = m_pIAliasNS->GetObject(bstrPath, 0, NULL, &pIWbemObj, NULL); if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format( L"IWbemServices::GetObject(L\"%s\", 0, NULL, -)", (WCHAR*) bstrPath); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace); } ONFAILTHROWERROR(hr); // Get Formats array property of alias object hr = pIWbemObj->Get(_bstr_t(L"Formats"), 0, &vtFormats, 0, 0); if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format(L"IWbemClassObject::Get(L\"Formats\", 0," L"-, 0, 0)"); GetBstrTFromVariant(vtFormats, bstrResult); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace, 0, bstrResult); } ONFAILTHROWERROR(hr); BOOL bSetVerb = pszVerbName != NULL && CompareTokens(pszVerbName,CLI_TOKEN_SET); if ( vtFormats.vt != VT_NULL && vtFormats.vt != VT_EMPTY ) { // Get lower and upper bounds of Formats array LONG lUpper = 0, lLower = 0; hr = SafeArrayGetLBound(vtFormats.parray, vtFormats.parray->cDims, &lLower); if ( m_eloErrLogOpt ) { chsMsg.Format(L"SafeArrayGetLBound(-, -, -)"); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, FALSE); } ONFAILTHROWERROR(hr); hr = SafeArrayGetUBound(vtFormats.parray,vtFormats.parray->cDims, &lUpper); if ( m_eloErrLogOpt ) { chsMsg.Format(L"SafeArrayGetUBound(-, -, -)"); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, FALSE); } ONFAILTHROWERROR(hr); // Iterate through the Formats array property for (LONG lIndex = lLower; lIndex <= lUpper; lIndex++) { // Get this property. hr=SafeArrayGetElement(vtFormats.parray,&lIndex,&pIEmbedObj); if ( m_eloErrLogOpt ) { chsMsg.Format(L"SafeArrayGetElement(-, -, -)"); WMITRACEORERRORLOG(hr, __LINE__, __FILE__,(LPCWSTR)chsMsg, dwThreadId, rParsedInfo, FALSE); } ONFAILTHROWERROR(hr); hr = pIEmbedObj->Get(_bstr_t(L"Name"),0,&vtFormatName,0,0); if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format(L"IWbemClassObject::Get(L\"Name\", 0," L"-, 0, 0)"); GetBstrTFromVariant(vtFormatName, bstrResult); WMITRACEORERRORLOG(hr, __LINE__, __FILE__,(LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace, 0, bstrResult); } ONFAILTHROWERROR(hr); BOOL bGetProps = FALSE; if ( pbCheckWritePropsAvailInAndOut != NULL) bGetProps = CompareTokens(_bstr_t(vtFormatName.bstrVal), _T("WRITEABLE")); else if ( pbCheckFULLPropsAvailInAndOut != NULL) bGetProps = CompareTokens(_bstr_t(vtFormatName.bstrVal), _T("FULL")); else { bGetProps = (bSetVerb) ? ((rParsedInfo.GetHelpInfoObject().GetHelp(SETVerb)) ? CompareTokens(_bstr_t(vtFormatName.bstrVal), _T("WRITEABLE")): CompareTokens(_bstr_t(vtFormatName.bstrVal), _T("FULL")) ): CompareTokens(_bstr_t(vtFormatName.bstrVal),_T("FULL")); } //Comparing the specified Format in the alias against //the formats available for the specified alias. if( bGetProps ) { //Getting the "Properties" property. hr=pIEmbedObj->Get(_bstr_t(L"Properties"),0, &vtProperties, 0, 0); if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format(L"IWbemClassObject::Get" L"(L\"Properties\", 0, -, 0, 0)"); GetBstrTFromVariant(vtProperties, bstrResult); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace, 0, bstrResult); } ONFAILTHROWERROR(hr); if ( vtProperties.vt != VT_NULL ) { LONG lILower = 0, lIUpper = 0; hr = SafeArrayGetLBound(vtProperties.parray, vtProperties.parray->cDims, &lILower); if ( m_eloErrLogOpt ) { chsMsg.Format(L"SafeArrayGetLBound(-, -, -)"); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, FALSE); } ONFAILTHROWERROR(hr); hr = SafeArrayGetUBound(vtProperties.parray, vtProperties.parray->cDims, &lIUpper); if ( m_eloErrLogOpt ) { chsMsg.Format(L"SafeArrayGetUBound(-, -, -)"); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, FALSE); } ONFAILTHROWERROR(hr); // Iterate through the Properties array property for(LONG lIIndex=lILower; lIIndex<=lIUpper; lIIndex++) { // Get this property. hr = SafeArrayGetElement(vtProperties.parray, &lIIndex, &pIEmbedObj2); if ( m_eloErrLogOpt ) { chsMsg.Format(L"SafeArrayGetElement(-, -, -)"); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg,dwThreadId, rParsedInfo, FALSE); } ONFAILTHROWERROR(hr); //Getting the "Name" property hr = pIEmbedObj2->Get(_bstr_t(L"Name"), 0, &vtPropertyName,0,0); if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format(L"IWbemClassObject::Get" L"(L\"Name\", 0, -, 0, 0)"); GetBstrTFromVariant(vtPropertyName, bstrResult); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg,dwThreadId, rParsedInfo, m_bTrace, 0, bstrResult); } ONFAILTHROWERROR(hr); //Getting the "Derivation" property hr = pIEmbedObj2->Get(_bstr_t(L"Derivation"), 0, &vtPropertyDerivation,0,0); if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format(L"IWbemClassObject::Get" L"(L\"Derivation\", 0, -, 0, 0)"); GetBstrTFromVariant(vtPropertyDerivation, bstrResult); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg,dwThreadId, rParsedInfo, m_bTrace, 0, bstrResult); } ONFAILTHROWERROR(hr); if (vtPropertyName.vt == VT_BSTR) { CHARVECTOR::iterator tempIterator; if ( bPropList == TRUE && !Find(cvPropList, _bstr_t(vtPropertyName.bstrVal), tempIterator) ) { SAFEIRELEASE(pIEmbedObj2) continue; } if ( pbCheckWritePropsAvailInAndOut != NULL) { *pbCheckWritePropsAvailInAndOut = TRUE; SAFEIRELEASE(pIEmbedObj2); break; } if ( pbCheckFULLPropsAvailInAndOut != NULL) { *pbCheckFULLPropsAvailInAndOut = TRUE; SAFEIRELEASE(pIEmbedObj2); break; } _bstr_t bstrDesc; hr = GetDescOfObject(pIEmbedObj2, bstrDesc, rParsedInfo); ONFAILTHROWERROR(hr); PROPERTYDETAILS pdPropDet; if (vtPropertyDerivation.vt == VT_BSTR) pdPropDet.Derivation = vtPropertyDerivation.bstrVal; else pdPropDet.Derivation = _bstr_t(TOKEN_NA); if (bstrDesc != _bstr_t("")) pdPropDet.Description = bstrDesc; else pdPropDet.Description = _bstr_t(TOKEN_NA); hr = GetQualifiers(pIEmbedObj2, pdPropDet, rParsedInfo); if (!pdPropDet.Type) pdPropDet.Type = _bstr_t(TOKEN_NA); if (!pdPropDet.Operation) pdPropDet.Operation = _bstr_t(TOKEN_NA); // Add propertyname to property list in // rParsedInfo rParsedInfo.GetCmdSwitchesObject(). AddToPropDetMap( vtPropertyName.bstrVal, pdPropDet); VARIANTCLEAR(vtPropertyName); VARIANTCLEAR(vtPropertyDerivation); } SAFEIRELEASE(pIEmbedObj2) } } // Release memory held by vtProperties VARIANTCLEAR(vtProperties); // Free memory held by vtFormatName VARIANTCLEAR(vtFormatName); // Release pIEmbedObj SAFEIRELEASE(pIEmbedObj); break; } // Free memory held by vtFormatName VARIANTCLEAR(vtFormatName); // Release pIEmbedObj SAFEIRELEASE(pIEmbedObj); } // Release memory held by vtFormats VARIANTCLEAR(vtFormats); } SAFEIRELEASE(pIWbemObj); } catch(_com_error& e) { SAFEIRELEASE(pIWbemObj); SAFEIRELEASE(pIEmbedObj); SAFEIRELEASE(pIEmbedObj2); VARIANTCLEAR(vtFormats); VARIANTCLEAR(vtFormatName); VARIANTCLEAR(vtProperties); VARIANTCLEAR(vtPropertyName); VARIANTCLEAR(vtPropertyDerivation); hr = e.Error(); rParsedInfo.GetCmdSwitchesObject().SetCOMError(e); } catch(CHeap_Exception) { SAFEIRELEASE(pIWbemObj); SAFEIRELEASE(pIEmbedObj); SAFEIRELEASE(pIEmbedObj2); VARIANTCLEAR(vtFormats); VARIANTCLEAR(vtFormatName); VARIANTCLEAR(vtProperties); VARIANTCLEAR(vtPropertyName); VARIANTCLEAR(vtPropertyDerivation); hr = WBEM_E_OUT_OF_MEMORY; _com_issue_error(hr); } return hr; } /*---------------------------------------------------------------------------- Name :GetDescOfObject Synopsis :Get the Localized description from alias definition. Type :Member Function Input parameter(s): pIWbemClassObject - IWbemLocator object rParsedInfo - The parsed info from command line input. Output parameter(s): bstrDescription - Localized description rParsedInfo` - The parsed info from command line input. Return Type :HRESULT Global Variables :None Calling Syntax :GetDescOfObject(pIObject, bstrDescription, rParsedInfo) Notes :None ----------------------------------------------------------------------------*/ HRESULT CCmdAlias::GetDescOfObject(IWbemClassObject* pIObject, _bstr_t& bstrDescription, CParsedInfo& rParsedInfo, BOOL bLocalizeFlag) { HRESULT hr = S_OK; DWORD dwThreadId = GetCurrentThreadId(); VARIANT vtDesc, vtRelPath; VariantInit(&vtDesc); VariantInit(&vtRelPath); try { CHString chsMsg; _bstr_t bstrRelPath; _bstr_t bstrResult; if (!bLocalizeFlag) { // Get "Description" property. hr = pIObject->Get(_bstr_t(L"Description"), 0, &vtDesc, 0, 0); if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format(L"IWbemClassObject::Get(L\"Description\", 0," L"-, 0, 0)"); GetBstrTFromVariant(vtDesc, bstrResult); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace, 0 ,bstrResult); } ONFAILTHROWERROR(hr); if (vtDesc.vt == VT_BSTR ) bstrDescription = vtDesc.bstrVal; VARIANTCLEAR(vtDesc); } else // Get the localized description { // Get the __RELPATH hr = pIObject->Get(_bstr_t(L"__RELPATH"), 0, &vtRelPath, 0, 0); if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format(L"IWbemClassObject::Get(L\"__RELPATH\", 0," L"-, 0, 0)"); GetBstrTFromVariant(vtRelPath, bstrResult); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace, 0, bstrResult); } ONFAILTHROWERROR(hr); if ((vtRelPath.vt != VT_NULL) && (vtRelPath.vt != VT_EMPTY)) { // Get localized description of the property. hr = GetLocalizedDesc(vtRelPath.bstrVal, bstrDescription, rParsedInfo); if(FAILED(hr)) { hr = S_OK; WMIFormatMessage(IDS_E_NO_DESC, 0, bstrDescription, NULL); } } VARIANTCLEAR(vtRelPath); } } catch (_com_error& e) { VARIANTCLEAR(vtRelPath); VARIANTCLEAR(vtDesc); rParsedInfo.GetCmdSwitchesObject().SetCOMError(e); hr = e.Error(); } catch(CHeap_Exception) { VARIANTCLEAR(vtRelPath); VARIANTCLEAR(vtDesc); hr = WBEM_E_OUT_OF_MEMORY; _com_issue_error(hr); } return hr; } /*---------------------------------------------------------------------------- Name :ObtainTranslateTableEntries Synopsis :Obtain the translate table information from the alias definition Type :Member Function Input parameter(s): rParsedInfo - The parsed info from command line input. Output parameter(s): rParsedInfo - The parsed info from command line input. Return Type :HRESULT Global Variables :None Calling Syntax :ObtainTranslateTableEntries(rParsedInfo) Notes :None ----------------------------------------------------------------------------*/ BOOL CCmdAlias::ObtainTranslateTableEntries(CParsedInfo& rParsedInfo) { BOOL bSuccess = TRUE; HRESULT hr = S_OK; IWbemClassObject *pIWbemObjOfTable = NULL, *pIWbemObjOfTblEntry = NULL; DWORD dwThreadId = GetCurrentThreadId(); VARIANT vtTblEntryArr, vtFromValue, vtToValue; VariantInit(&vtTblEntryArr); VariantInit(&vtFromValue); VariantInit(&vtToValue); try { CHString chsMsg; _bstr_t bstrResult; _bstr_t bstrPath = _bstr_t("MSFT_CliTranslateTable.Name='") + _bstr_t(rParsedInfo.GetCmdSwitchesObject().GetTranslateTableName())+ _bstr_t(L"'"); hr = m_pIAliasNS->GetObject(bstrPath, 0, NULL, &pIWbemObjOfTable, NULL); if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format(L"IWbemServices::GetObject(L\"%s\", 0, NULL, -)", (WCHAR*) bstrPath); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace); } // do not add ONFAILTHROWERROR(hr) here, as following statement checks // for validity if ( pIWbemObjOfTable != NULL ) { VariantInit(&vtTblEntryArr); hr = pIWbemObjOfTable->Get(_bstr_t(L"Tbl"), 0, &vtTblEntryArr, 0, 0 ); if ( vtTblEntryArr.vt != VT_NULL && vtTblEntryArr.vt != VT_EMPTY ) { LONG lUpper = 0, lLower = 0; hr = SafeArrayGetLBound(vtTblEntryArr.parray, vtTblEntryArr.parray->cDims, &lLower); if ( m_eloErrLogOpt ) { chsMsg.Format(L"SafeArrayGetLBound(-, -, -)"); WMITRACEORERRORLOG(hr, __LINE__, __FILE__,(LPCWSTR)chsMsg, dwThreadId, rParsedInfo, FALSE); } ONFAILTHROWERROR(hr); hr = SafeArrayGetUBound(vtTblEntryArr.parray, vtTblEntryArr.parray->cDims, &lUpper); if ( m_eloErrLogOpt ) { chsMsg.Format(L"SafeArrayGetUBound(-, -, -)"); WMITRACEORERRORLOG(hr, __LINE__, __FILE__,(LPCWSTR)chsMsg, dwThreadId, rParsedInfo, FALSE); } ONFAILTHROWERROR(hr); for (LONG lIndex = lLower; lIndex <= lUpper; lIndex++) { pIWbemObjOfTblEntry = NULL; hr = SafeArrayGetElement(vtTblEntryArr.parray,&lIndex, &pIWbemObjOfTblEntry); if ( m_eloErrLogOpt ) { chsMsg.Format(L"SafeArrayGetElement(-, -, -)"); WMITRACEORERRORLOG(hr, __LINE__, __FILE__,(LPCWSTR)chsMsg, dwThreadId, rParsedInfo, FALSE); } ONFAILTHROWERROR(hr); VariantInit(&vtFromValue); VariantInit(&vtToValue); hr = pIWbemObjOfTblEntry->Get(_bstr_t(L"FromValue"), 0, &vtFromValue, 0, 0 ); if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format(L"IWbemClassObject::Get(L\"FromValue\"," L"0, -, 0, 0)"); GetBstrTFromVariant(vtFromValue, bstrResult); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace, 0, bstrResult); } ONFAILTHROWERROR(hr); hr = pIWbemObjOfTblEntry->Get(_bstr_t(L"ToValue"), 0, &vtToValue, 0, 0 ); if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format(L"IWbemClassObject::Get(L\"ToValue\", " L"0, -, 0, 0)"); GetBstrTFromVariant(vtToValue, bstrResult); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace, 0 , bstrResult); } ONFAILTHROWERROR(hr); rParsedInfo.GetCmdSwitchesObject(). AddToAlsFrnNmsOrTrnsTblMap( _bstr_t(vtFromValue.bstrVal), _bstr_t(vtToValue.bstrVal) ); VARIANTCLEAR(vtFromValue); VARIANTCLEAR(vtToValue); SAFEIRELEASE(pIWbemObjOfTblEntry); } } else bSuccess = FALSE; SAFEIRELEASE(pIWbemObjOfTable); VARIANTCLEAR(vtTblEntryArr); } else bSuccess = FALSE; } catch(_com_error& e) { rParsedInfo.GetCmdSwitchesObject().SetCOMError(e); bSuccess = FALSE; SAFEIRELEASE(pIWbemObjOfTable); VARIANTCLEAR(vtTblEntryArr); VARIANTCLEAR(vtFromValue); VARIANTCLEAR(vtToValue); SAFEIRELEASE(pIWbemObjOfTblEntry); } catch(CHeap_Exception) { bSuccess = FALSE; SAFEIRELEASE(pIWbemObjOfTable); VARIANTCLEAR(vtTblEntryArr); VARIANTCLEAR(vtFromValue); VARIANTCLEAR(vtToValue); SAFEIRELEASE(pIWbemObjOfTblEntry); hr = WBEM_E_OUT_OF_MEMORY; _com_issue_error(hr); } return bSuccess; } /*---------------------------------------------------------------------------- Name :PopulateAliasFormatMap Synopsis :populate the alias format map with the available formats Type :Member Function Input parameter(s): rParsedInfo - reference to CParsedInfo class object Output parameter(s): rParsedInfo - reference to CParsedInfo class object Return Type :HRESULT Global Variables :None Calling Syntax :PopulateAliasFormatMap(rParsedInfo) Notes :None ----------------------------------------------------------------------------*/ HRESULT CCmdAlias::PopulateAliasFormatMap(CParsedInfo& rParsedInfo) { // variables being used in this function. HRESULT hr = S_OK; IWbemClassObject *pIWbemObj = NULL; IWbemClassObject *pIEmbedObj = NULL; VARIANT vtFormats, vtFormatName; // Initializing all Variants variables being used in this function. VariantInit(&vtFormats); VariantInit(&vtFormatName); DWORD dwThreadId = GetCurrentThreadId(); try { CHString chsMsg; _bstr_t bstrResult; _bstr_t bstrPath = _bstr_t("MSFT_CliAlias.FriendlyName='") + _bstr_t(rParsedInfo.GetCmdSwitchesObject().GetAliasName()) + _bstr_t(L"'"); // Get alias object hr = m_pIAliasNS->GetObject(bstrPath, 0, NULL, &pIWbemObj, NULL); if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format(L"IWbemServices::GetObject(L\"%s\", 0, NULL, -)", (WCHAR*) bstrPath); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace); } ONFAILTHROWERROR(hr); // Get Formats array property of alias object hr = pIWbemObj->Get(_bstr_t(L"Formats"), 0, &vtFormats, 0, 0); if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format(L"IWbemClassObject::Get(L\"Formats\", 0," L"-, 0, 0)"); GetBstrTFromVariant(vtFormats, bstrResult); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace, 0, bstrResult); } ONFAILTHROWERROR(hr); if ( vtFormats.vt != VT_NULL && vtFormats.vt != VT_EMPTY ) { // Get lower and upper bounds of Formats array LONG lUpper = 0, lLower = 0; hr = SafeArrayGetLBound(vtFormats.parray, vtFormats.parray->cDims, &lLower); if ( m_eloErrLogOpt ) { chsMsg.Format(L"SafeArrayGetLBound(-, -, -)"); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, FALSE); } ONFAILTHROWERROR(hr); hr = SafeArrayGetUBound(vtFormats.parray, vtFormats.parray->cDims, &lUpper); if ( m_eloErrLogOpt ) { chsMsg.Format(L"SafeArrayGetUBound(-, -, -)"); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, FALSE); } ONFAILTHROWERROR(hr); // Iterate through the Formats array property for (LONG lIndex = lLower; lIndex <= lUpper; lIndex++) { VariantInit(&vtFormatName); // Get this property. hr =SafeArrayGetElement(vtFormats.parray,&lIndex,&pIEmbedObj); if ( m_eloErrLogOpt ) { chsMsg.Format(L"SafeArrayGetElement(-, -, -)"); WMITRACEORERRORLOG(hr, __LINE__, __FILE__,(LPCWSTR)chsMsg, dwThreadId, rParsedInfo, FALSE); } ONFAILTHROWERROR(hr); hr = pIEmbedObj->Get(_bstr_t(L"Name"),0,&vtFormatName,0,0); if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format(L"IWbemClassObject::Get(L\"Name\", 0," L"-, 0, 0)"); GetBstrTFromVariant(vtFormatName, bstrResult); WMITRACEORERRORLOG(hr, __LINE__, __FILE__,(LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace, 0, bstrResult); } ONFAILTHROWERROR(hr); // To obtain properties from alias associated with the format rParsedInfo.GetCmdSwitchesObject().SetListFormat( _bstr_t(vtFormatName.bstrVal)); if ( ObtainAliasFormat(rParsedInfo) == TRUE ) { CHARVECTOR cvProps = rParsedInfo.GetCmdSwitchesObject(). GetPropertyList(); CHARVECTOR::iterator cvIterator; BSTRVECTOR bvProps; for ( cvIterator = cvProps.begin(); cvIterator != cvProps.end(); cvIterator++ ) { bvProps.push_back(_bstr_t(*cvIterator)); } //Add format name to format list in rParsedInfo rParsedInfo.GetCmdSwitchesObject(). AddToAliasFormatDetMap(vtFormatName.bstrVal, bvProps); rParsedInfo.GetCmdSwitchesObject().ClearPropertyList(); } SAFEIRELEASE(pIEmbedObj); } // Release memory held by vtFormats VARIANTCLEAR(vtFormats); } // Release pIWbem object SAFEIRELEASE(pIWbemObj); } catch(_com_error& e) { SAFEIRELEASE(pIEmbedObj); SAFEIRELEASE(pIWbemObj); VARIANTCLEAR(vtFormats); VARIANTCLEAR(vtFormatName); rParsedInfo.GetCmdSwitchesObject().SetCOMError(e); hr = e.Error(); } catch(CHeap_Exception) { SAFEIRELEASE(pIEmbedObj); SAFEIRELEASE(pIWbemObj); VARIANTCLEAR(vtFormats); VARIANTCLEAR(vtFormatName); hr = WBEM_E_OUT_OF_MEMORY; _com_issue_error(hr); } return hr; } /*---------------------------------------------------------------------------- Name :ObtainTranslateTables Synopsis :Obtain the information about translate tables available Type :Member Function Input parameter(s): rParsedInfo - reference to CParsedInfo class object Output parameter(s): rParsedInfo - reference to CParsedInfo class object Return Type :HRESULT Global Variables :None Calling Syntax :ObtainTranslateTables(rParsedInfo) Notes :None ----------------------------------------------------------------------------*/ HRESULT CCmdAlias::ObtainTranslateTables(CParsedInfo& rParsedInfo) { // variables being used in this function. HRESULT hr = S_OK; IEnumWbemClassObject *pIEnumObj = NULL; IWbemClassObject *pIWbemObj = NULL; DWORD dwThreadId = GetCurrentThreadId(); VARIANT vtName; VariantInit(&vtName); try { CHString chsMsg; _bstr_t bstrResult; // Get alias object hr = m_pIAliasNS->ExecQuery(_bstr_t(L"WQL"), _bstr_t(L"SELECT * FROM MSFT_CliTranslateTable"), WBEM_FLAG_FORWARD_ONLY| WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pIEnumObj); if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format(L"IWbemServices::ExecQuery(L\"WQL\"," L"L\"SELECT * FROM MSFT_CliTranslateTable\"," L"WBEM_FLAG_FORWARD_ONLY|WBEM_FLAG_RETURN_IMMEDIATELY," L"NULL, -)"); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace); } ONFAILTHROWERROR(hr); // Set the security hr = SetSecurity(pIEnumObj, NULL, NULL, NULL, NULL, rParsedInfo.GetGlblSwitchesObject().GetAuthenticationLevel(), rParsedInfo.GetGlblSwitchesObject().GetImpersonationLevel()); if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format( L"CoSetProxyBlanket(-, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE," L"NULL, %d, %d, -, EOAC_NONE)", rParsedInfo.GetGlblSwitchesObject().GetAuthenticationLevel(), rParsedInfo.GetGlblSwitchesObject().GetImpersonationLevel()); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace); } ONFAILTHROWERROR(hr); ULONG ulReturned = 0; hr=pIEnumObj->Next(WBEM_INFINITE,1,&pIWbemObj,&ulReturned); if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format(L"IEnumWbemClassObject->Next" L"(WBEM_INFINITE, 1, -, -)"); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace); } ONFAILTHROWERROR(hr); // Obtain the object starting at the current position in the // enumeration and loop through the instance list. while(ulReturned == 1) { VariantInit(&vtName); // Gets "FriendlyName" array property of alias object hr = pIWbemObj->Get(_bstr_t(L"Name"), 0, &vtName, 0, 0); if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format(L"IWbemClassObject::Get(L\"Name\", 0," L"-, 0, 0)"); GetBstrTFromVariant(vtName, bstrResult); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace, 0, bstrResult); } ONFAILTHROWERROR(hr); if (vtName.vt != VT_NULL && vtName.vt != VT_EMPTY) { rParsedInfo.GetCmdSwitchesObject(). AddToTrnsTablesList(vtName.bstrVal); } VARIANTCLEAR(vtName); SAFEIRELEASE(pIWbemObj); // Move to next instance in the enumeration. hr = pIEnumObj->Next(WBEM_INFINITE, 1, &pIWbemObj, &ulReturned); if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format( L"IEnumWbemClassObject->Next(WBEM_INFINITE, 1, -, -)"); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace); } ONFAILTHROWERROR(hr); } SAFEIRELEASE(pIEnumObj); } catch(_com_error& e) { SAFEIRELEASE(pIEnumObj); SAFEIRELEASE(pIWbemObj); VARIANTCLEAR(vtName); rParsedInfo.GetCmdSwitchesObject().SetCOMError(e); hr = e.Error(); } catch(CHeap_Exception) { SAFEIRELEASE(pIEnumObj); SAFEIRELEASE(pIWbemObj); VARIANTCLEAR(vtName); hr = WBEM_E_OUT_OF_MEMORY; _com_issue_error(hr); } return hr; } /*---------------------------------------------------------------------------- Name :ConnectToLocalizedNS Synopsis :This function connects to localized WMI namespace Type :Member Function Input parameter(s): rParsedInfo - reference to CParsedInfo class object. pIWbemLocator- IWbemLocator object for connecting to WMI. Output parameter(s): rParsedInfo - reference to CParsedInfo class object. Return Type :HRESULT Global Variables :None Calling Syntax :ConnectToLocalizedNS(rParsedInfo,pIWbemLocator) Notes :None ----------------------------------------------------------------------------*/ HRESULT CCmdAlias::ConnectToLocalizedNS(CParsedInfo& rParsedInfo, IWbemLocator* pIWbemLocator) { DWORD dwThreadId = GetCurrentThreadId(); HRESULT hr = S_OK; // If the /LOCALE value has been changed since last invocation if (rParsedInfo.GetGlblSwitchesObject().GetLocaleFlag()) { SAFEIRELEASE(m_pILocalizedNS); try { CHString chsMsg; _bstr_t bstrNS = _bstr_t(rParsedInfo.GetGlblSwitchesObject(). GetRole()) + _bstr_t(L"\\") + _bstr_t(rParsedInfo.GetGlblSwitchesObject(). GetLocale()); // Connect to the specified namespace of Windows Management on the // local computer using the locator object. hr = Connect(pIWbemLocator, &m_pILocalizedNS, bstrNS, NULL, NULL, _bstr_t(rParsedInfo.GetGlblSwitchesObject(). GetLocale()), rParsedInfo); // If /TRACE is ON if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format( L"IWbemLocator::ConnectServer(L\"%s\", NULL, " L"NULL, L\"%s\", 0L, NULL, NULL, -)", (WCHAR*) bstrNS, rParsedInfo.GetGlblSwitchesObject().GetLocale()); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace); } ONFAILTHROWERROR(hr); // If /TRACE is ON if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format( L"CoSetProxyBlanket(-, RPC_C_AUTHN_WINNT, " L"RPC_C_AUTHZ_NONE, NULL, %d, %d, -, EOAC_NONE)", rParsedInfo.GetGlblSwitchesObject().GetAuthenticationLevel(), rParsedInfo.GetGlblSwitchesObject().GetImpersonationLevel()); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace); } ONFAILTHROWERROR(hr); rParsedInfo.GetGlblSwitchesObject().SetLocaleFlag(FALSE); } catch(_com_error& e) { // Set the COM error rParsedInfo.GetCmdSwitchesObject().SetCOMError(e); hr = e.Error(); } catch(CHeap_Exception) { // Set the COM error hr = WBEM_E_OUT_OF_MEMORY; _com_issue_error(hr); } } return hr; } /*---------------------------------------------------------------------------- Name :GetLocalizedDesc Synopsis :This function retrieves the localized description for the object with given relative path, Type :Member Function Input parameter(s): bstrRelPath - relativepath of the object for which localized description has to be retrieved. rParsedInfo - reference to CParsedInfo class object. Output parameter(s): bstrDesc - localized description rParsedInfo - reference to CParsedInfo class object. Return Type :HRESULT Global Variables :None Calling Syntax :GetLocalizedDesc(bstrRelPath, bstrDesc, rParsedInfo) Notes :None ----------------------------------------------------------------------------*/ HRESULT CCmdAlias::GetLocalizedDesc(_bstr_t bstrRelPath, _bstr_t& bstrDesc, CParsedInfo& rParsedInfo) { HRESULT hr = S_OK; IWbemClassObject *pIObject = NULL; DWORD dwThreadId = GetCurrentThreadId(); VARIANT vtDesc, vtTemp; VariantInit(&vtDesc); VariantInit(&vtTemp); try { CHString chsMsg; _bstr_t bstrResult; CHString sTemp((WCHAR*)bstrRelPath); // Substitue escape characters i.e. replace '\"' with '\\\"' SubstituteEscapeChars(sTemp, L"\""); // Object path _bstr_t bstrPath = _bstr_t(L"MSFT_LocalizablePropertyValue.ObjectLocator=\"\",PropertyName=") + _bstr_t(L"\"Description\",RelPath=\"") + _bstr_t(sTemp) + _bstr_t(L"\""); // Retrieve the object hr = m_pILocalizedNS->GetObject(bstrPath, 0, NULL, &pIObject, NULL); if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format( L"IWbemServices::GetObject(L\"%s\", 0, NULL, -)", (WCHAR*) bstrPath); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace); } ONFAILTHROWERROR(hr); // Get localized description of the property. hr = pIObject->Get(_bstr_t(L"Text"), 0, &vtDesc, 0, 0); if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format(L"IWbemClassObject::Get(L\"Text\", 0, -, 0, 0)"); GetBstrTFromVariant(vtDesc, bstrResult); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace, 0, bstrResult); } ONFAILTHROWERROR(hr); if (vtDesc.vt != VT_EMPTY && vtDesc.vt != VT_NULL) { // Get lower and upper bounds of 'Text' array LONG lUpper = 0, lLower = 0; hr = SafeArrayGetLBound(vtDesc.parray, vtDesc.parray->cDims, &lLower); ONFAILTHROWERROR(hr); hr = SafeArrayGetUBound(vtDesc.parray, vtDesc.parray->cDims, &lUpper); ONFAILTHROWERROR(hr); // Iterate through the Formats array property for (LONG lIndex = lLower; lIndex <= lUpper; lIndex++) { BSTR bstrTemp = NULL; hr = SafeArrayGetElement(vtDesc.parray, &lIndex, &bstrTemp); ONFAILTHROWERROR(hr); if (bstrTemp) bstrDesc += bstrTemp; } } VariantClear(&vtDesc); SAFEIRELEASE(pIObject); } catch (_com_error& e) { VariantClear(&vtTemp); VariantClear(&vtDesc); SAFEIRELEASE(pIObject); hr = e.Error(); } catch(CHeap_Exception) { VariantClear(&vtTemp); VariantClear(&vtDesc); SAFEIRELEASE(pIObject); hr = WBEM_E_OUT_OF_MEMORY; _com_issue_error(hr); } return hr; } /*---------------------------------------------------------------------------- Name :GetQualifiers Synopsis :This function retrieves the qualifiers associated with propety/parameter referred by pIWbemClassObject Type :Member Function Input parameter(s): pIWbemClassObject - pointer to IWbemClassObject rPropDet - reference to PROPERTYDETAILS object rParsedInfo - reference to CParsedInfo class object. Output parameter(s): rPropDet - reference to PROPERTYDETAILS object rParsedInfo - reference to CParsedInfo class object. Return Type :HRESULT Global Variables :None Calling Syntax :GetQualifiers(pIObj, rPropDet, rParsedInfo) Notes :None ----------------------------------------------------------------------------*/ HRESULT CCmdAlias::GetQualifiers(IWbemClassObject *pIWbemClassObject, PROPERTYDETAILS& rPropDet, CParsedInfo& rParsedInfo) { IWbemClassObject *pIWbemQualObject = NULL; HRESULT hr = S_OK; DWORD dwThreadId = GetCurrentThreadId(); VARIANT vtQualifiers, vtQualName, vtQualValues; VariantInit(&vtQualifiers); VariantInit(&vtQualName); VariantInit(&vtQualValues); try { CHString chsMsg; _bstr_t bstrResult; //Getting the "Qualifiers" property. hr=pIWbemClassObject->Get(_bstr_t(L"Qualifiers"), 0, &vtQualifiers, 0, 0); if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format(L"IWbemClassObject::Get" L"(L\"Qualifiers\", 0, -, 0, 0)"); GetBstrTFromVariant(vtQualifiers, bstrResult); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace, 0, bstrResult); } ONFAILTHROWERROR(hr); if ( vtQualifiers.vt != VT_NULL && vtQualifiers.vt != VT_EMPTY ) { LONG lLower = 0, lUpper = 0; hr = SafeArrayGetLBound(vtQualifiers.parray, vtQualifiers.parray->cDims, &lLower); if ( m_eloErrLogOpt ) { chsMsg.Format(L"SafeArrayGetLBound(-, -, -)"); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, FALSE); } ONFAILTHROWERROR(hr); hr = SafeArrayGetUBound(vtQualifiers.parray, vtQualifiers.parray->cDims, &lUpper); if ( m_eloErrLogOpt ) { chsMsg.Format(L"SafeArrayGetUBound(-, -, -)"); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, FALSE); } ONFAILTHROWERROR(hr); // Iterate through the Properties array property for(LONG lIndex=lLower; lIndex<=lUpper; lIndex++) { pIWbemQualObject = NULL; // Get this property. hr = SafeArrayGetElement(vtQualifiers.parray, &lIndex, &pIWbemQualObject); if ( m_eloErrLogOpt ) { chsMsg.Format(L"SafeArrayGetElement(-, -, -)"); WMITRACEORERRORLOG(hr, __LINE__, __FILE__,(LPCWSTR)chsMsg, dwThreadId, rParsedInfo, FALSE); } ONFAILTHROWERROR(hr); //Getting the "Name" property hr = pIWbemQualObject->Get(_bstr_t(L"Name"), 0, &vtQualName,0,0); if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format(L"IWbemClassObject::Get" L"(L\"Name\", 0, -, 0, 0)"); GetBstrTFromVariant(vtQualName, bstrResult); WMITRACEORERRORLOG(hr, __LINE__, __FILE__,(LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace, 0, bstrResult); } ONFAILTHROWERROR(hr); //Getting the "QualifierValue" property. hr=pIWbemQualObject->Get(_bstr_t(L"QualifierValue"),0, &vtQualValues, 0, 0); if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format(L"IWbemClassObject::Get" L"(L\"QualifierValue\", 0, -, 0, 0)"); GetBstrTFromVariant(vtQualValues, bstrResult); WMITRACEORERRORLOG(hr, __LINE__, __FILE__,(LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace, 0, bstrResult); } ONFAILTHROWERROR(hr); BSTRVECTOR bvQualValues; if ( vtQualValues.vt != VT_NULL && vtQualValues.vt != VT_EMPTY ) { LONG lILower = 0, lIUpper = 0; hr = SafeArrayGetLBound(vtQualValues.parray, vtQualValues.parray->cDims, &lILower); if ( m_eloErrLogOpt ) { chsMsg.Format(L"SafeArrayGetLBound(-, -, -)"); WMITRACEORERRORLOG(hr, __LINE__, __FILE__,(LPCWSTR)chsMsg, dwThreadId, rParsedInfo, FALSE); } ONFAILTHROWERROR(hr); hr = SafeArrayGetUBound(vtQualValues.parray, vtQualValues.parray->cDims, &lIUpper); if ( m_eloErrLogOpt ) { chsMsg.Format(L"SafeArrayGetUBound(-, -, -)"); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, FALSE); } ONFAILTHROWERROR(hr); BOOL bIsType = FALSE; BOOL bIsRead = FALSE; BOOL bIsWrite = FALSE; BOOL bIsIn = FALSE; BOOL bIsOut = FALSE; if (CompareTokens((WCHAR*)vtQualName.bstrVal, _T("CIMTYPE"))) { bIsType = TRUE; } else if (CompareTokens((WCHAR*)vtQualName.bstrVal, _T("read"))) { bIsRead = TRUE; } else if (CompareTokens((WCHAR*)vtQualName.bstrVal, _T("write"))) { bIsWrite = TRUE; } else if (CompareTokens((WCHAR*)vtQualName.bstrVal, _T("In"))) { bIsIn = TRUE; } else if (CompareTokens((WCHAR*)vtQualName.bstrVal, _T("Out"))) { bIsOut = TRUE; } // Iterate through the Properties array property for(LONG lIIndex=lILower; lIIndex<=lIUpper; lIIndex++) { BSTR bstrQualValue = NULL; // Get this property. hr = SafeArrayGetElement(vtQualValues.parray, &lIIndex, &bstrQualValue); if ( m_eloErrLogOpt ) { chsMsg.Format(L"SafeArrayGetElement(-, -, -)"); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, FALSE); } ONFAILTHROWERROR(hr); if (bstrQualValue) bvQualValues.push_back(bstrQualValue); if ( lIIndex == 0 ) { if ( bIsType == TRUE ) { rPropDet.Type = bstrQualValue; } else if ( bIsRead == TRUE && CompareTokens((WCHAR*)bstrQualValue, _T("true"))) { if (!rPropDet.Operation) rPropDet.Operation += _bstr_t("Read"); else rPropDet.Operation += _bstr_t("/Read"); } else if ( bIsWrite == TRUE && CompareTokens((WCHAR*)bstrQualValue, _T("true"))) { if (!rPropDet.Operation) rPropDet.Operation += _bstr_t("Write"); else rPropDet.Operation += _bstr_t("/Write"); } else if ( bIsIn == TRUE && CompareTokens((WCHAR*)bstrQualValue, _T("true"))) { rPropDet.InOrOut = INP; } else if ( bIsOut == TRUE && CompareTokens((WCHAR*)bstrQualValue, _T("true"))) { rPropDet.InOrOut = OUTP; } } } VARIANTCLEAR(vtQualValues); } rPropDet.QualDetMap.insert (QUALDETMAP::value_type(vtQualName.bstrVal, bvQualValues)); VARIANTCLEAR(vtQualName); SAFEIRELEASE(pIWbemQualObject); } VARIANTCLEAR(vtQualifiers); } } catch (_com_error& e) { VARIANTCLEAR(vtQualValues); VARIANTCLEAR(vtQualName); VARIANTCLEAR(vtQualifiers); SAFEIRELEASE(pIWbemQualObject); hr = e.Error(); // Set the COM error rParsedInfo.GetCmdSwitchesObject().SetCOMError(e); } catch(CHeap_Exception) { VARIANTCLEAR(vtQualValues); VARIANTCLEAR(vtQualName); VARIANTCLEAR(vtQualifiers); SAFEIRELEASE(pIWbemQualObject); hr = WBEM_E_OUT_OF_MEMORY; _com_issue_error(hr); } return hr; } /*---------------------------------------------------------------------------- Name :AreMethodsAvailable Synopsis :Checks whether method are available with alias or not. Type :Member Function Input parameter(s): rParsedInfo - reference to CParsedInfo class object. Output parameter(s):None Return Type :BOOL Global Variables :None Calling Syntax :AreMethodsAvailable(rParsedInfo) Notes :None ----------------------------------------------------------------------------*/ BOOL CCmdAlias::AreMethodsAvailable(CParsedInfo& rParsedInfo) { BOOL bMethAvail = TRUE; HRESULT hr = S_OK; IWbemClassObject *pIWbemObj = NULL; DWORD dwThreadId = GetCurrentThreadId(); VARIANT vtVerbs; VariantInit(&vtVerbs); try { CHString chsMsg; _bstr_t bstrResult; _bstr_t bstrPath = _bstr_t("MSFT_CliAlias.FriendlyName='") + _bstr_t(rParsedInfo.GetCmdSwitchesObject().GetAliasName())+ _bstr_t(L"'"); //Retrieving the object from the namespace in m_pIAliasNS hr = m_pIAliasNS->GetObject(bstrPath, 0, NULL, &pIWbemObj, NULL); if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format(L"IWbemServices::GetObject(L\"%s\", 0, NULL, -)", (WCHAR*) bstrPath); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace); } ONFAILTHROWERROR(hr); // Get "Verbs" property. hr = pIWbemObj->Get(_bstr_t(L"Verbs"), 0, &vtVerbs, 0, 0) ; if (m_bTrace || m_eloErrLogOpt) { chsMsg.Format(L"IWbemClassObject::Get(L\"Verbs\", 0, -, 0, 0)"); GetBstrTFromVariant(vtVerbs, bstrResult); WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace, 0, bstrResult); } ONFAILTHROWERROR(hr); if ( vtVerbs.vt == VT_NULL || vtVerbs.vt == VT_EMPTY ) bMethAvail = FALSE; SAFEIRELEASE(pIWbemObj); VARIANTCLEAR(vtVerbs); } catch(_com_error& e) { bMethAvail = FALSE; SAFEIRELEASE(pIWbemObj); VARIANTCLEAR(vtVerbs); rParsedInfo.GetCmdSwitchesObject().SetCOMError(e); bMethAvail = FALSE; } catch(CHeap_Exception) { bMethAvail = FALSE; SAFEIRELEASE(pIWbemObj); VARIANTCLEAR(vtVerbs); bMethAvail = FALSE; hr = WBEM_E_OUT_OF_MEMORY; _com_issue_error(hr); } return bMethAvail; }