windows-nt/Source/XPSP1/NT/admin/wmi/wbem/tools/wmic/cmdalias.cpp
2020-09-26 16:20:57 +08:00

2968 lines
91 KiB
C++

/*****************************************************************************
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 <empty>
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;
}