|
|
/*****************************************************************************
Copyright (c) Microsoft Corporation
Module Name:
ETQuery.CPP
Abstract:
This module is intended to have the functionality for EVENTTRIGGERS.EXE with -query parameter.
This will Query WMI and shows presently available Event Triggers.
Author: Akhil Gokhale 03-Oct.-2000 (Created it)
Revision History:
******************************************************************************/ #include "pch.h"
#include "ETCommon.h"
#include "resource.h"
#include "ShowError.h"
#include "ETQuery.h"
#include "WMI.h"
#define DEFAULT_USER L"NT AUTHORITY\\SYSTEM"
#define DBL_SLASH L"\\\\";
// Defines local to this file
#define SHOW_WQL_QUERY L"select * from __instancecreationevent where"
#define QUERY_STRING_AND L"select * from __instancecreationevent where \
targetinstance isa \"win32_ntlogevent\" AND" #define BLANK_LINE L"\n"
#define QUERY_SCHEDULER_STATUS L"select * from Win32_Service where Name=\"Schedule\""
#define STATUS_PROPERTY L"Started"
CETQuery::CETQuery() /*++
Routine Description: Class default constructor.
Arguments: None Return Value: None
--*/ { // init to defaults
m_bNeedDisconnect = FALSE; m_pszServerName = NULL; m_pszUserName = NULL; m_pszPassword = NULL; m_pszFormat = NULL; m_pszTriggerID = NULL; m_bVerbose = FALSE; m_bNoHeader = FALSE;
m_bNeedPassword = FALSE; m_bUsage = FALSE; m_bQuery = FALSE; m_pWbemLocator = NULL; m_pWbemServices = NULL; m_pAuthIdentity = NULL; m_pObj = NULL; m_pTriggerEventConsumer = NULL; m_pEventFilter = NULL; m_arrColData = NULL; m_pszEventQuery = NULL; m_bIsCOMInitialize = FALSE; m_dwLowerBound = 0; m_dwUpperBound = 0;
m_pClass = NULL; m_pInClass = NULL; m_pInInst = NULL; m_pOutInst = NULL;
m_pITaskScheduler = NULL;
m_lHostNameColWidth = WIDTH_HOSTNAME; m_lTriggerIDColWidth = WIDTH_TRIGGER_ID; m_lETNameColWidth = WIDTH_TRIGGER_NAME; m_lTaskColWidth = WIDTH_TASK; m_lQueryColWidth = WIDTH_EVENT_QUERY; m_lDescriptionColWidth = WIDTH_DESCRIPTION; m_lWQLColWidth = 0; m_lTaskUserName = WIDTH_TASK_USERNAME;
}
CETQuery::CETQuery( LONG lMinMemoryReq, BOOL bNeedPassword ) /*++
Routine Description: Class constructor.
Arguments: None Return Value: None
--*/ { // init to defaults
m_bNeedDisconnect = FALSE;
m_pszServerName = NULL; m_pszUserName = NULL; m_pszPassword = NULL; m_pszFormat = NULL; m_pszTriggerID = NULL; m_bVerbose = FALSE; m_bNoHeader = FALSE; m_bIsCOMInitialize = FALSE;
m_bNeedPassword = bNeedPassword; m_bUsage = FALSE; m_bQuery = FALSE; m_lMinMemoryReq = lMinMemoryReq;
m_pClass = NULL; m_pInClass = NULL; m_pInInst = NULL; m_pOutInst = NULL;
m_pWbemLocator = NULL; m_pWbemServices = NULL; m_pAuthIdentity = NULL; m_arrColData = NULL; m_pObj = NULL; m_pTriggerEventConsumer = NULL; m_pEventFilter = NULL; m_dwLowerBound = 0; m_dwUpperBound = 0; m_pITaskScheduler = NULL;
m_pszEventQuery = NULL; m_lHostNameColWidth = WIDTH_HOSTNAME; m_lTriggerIDColWidth = WIDTH_TRIGGER_ID; m_lETNameColWidth = WIDTH_TRIGGER_NAME; m_lTaskColWidth = WIDTH_TASK; m_lQueryColWidth = WIDTH_EVENT_QUERY; m_lDescriptionColWidth = WIDTH_DESCRIPTION; m_lWQLColWidth = 0; m_lTaskUserName = WIDTH_TASK_USERNAME; }
CETQuery::~CETQuery() /*++
Routine Description: Class desctructor. It frees memory which is allocated during instance creation.
Arguments: None Return Value: None
--*/ { DEBUG_INFO; FreeMemory((LPVOID*)& m_pszUserName); FreeMemory((LPVOID*)& m_pszPassword); FreeMemory((LPVOID*)& m_pszFormat); FreeMemory((LPVOID*)& m_pszTriggerID); DESTROY_ARRAY(m_arrColData);
SAFE_RELEASE_INTERFACE(m_pWbemLocator); SAFE_RELEASE_INTERFACE(m_pWbemServices); SAFE_RELEASE_INTERFACE(m_pObj); SAFE_RELEASE_INTERFACE(m_pTriggerEventConsumer); SAFE_RELEASE_INTERFACE(m_pEventFilter);
SAFE_RELEASE_INTERFACE(m_pClass); SAFE_RELEASE_INTERFACE(m_pInClass); SAFE_RELEASE_INTERFACE(m_pInInst); SAFE_RELEASE_INTERFACE(m_pOutInst); SAFE_RELEASE_INTERFACE(m_pITaskScheduler);
// Release Authority
WbemFreeAuthIdentity(&m_pAuthIdentity);
RELEASE_MEMORY_EX(m_pszEventQuery);
// Close the remote connection if any.
if (FALSE == m_bLocalSystem) { CloseConnection(m_pszServerName); } FreeMemory((LPVOID*)& m_pszServerName);
// Uninitialize COM only when it is initialized.
if( TRUE == m_bIsCOMInitialize ) { CoUninitialize(); } DEBUG_INFO;
}
void CETQuery::PrepareCMDStruct() /*++
Routine Description: This function will prepare column structure for DoParseParam Function.
Arguments: none Return Value: none --*/ { DEBUG_INFO; // -query
StringCopyA( cmdOptions[ ID_Q_QUERY ].szSignature, "PARSER2\0", 8 ); cmdOptions[ ID_Q_QUERY ].dwType = CP_TYPE_BOOLEAN; cmdOptions[ ID_Q_QUERY ].pwszOptions = szQueryOption; cmdOptions[ ID_Q_QUERY ].dwCount = 1; cmdOptions[ ID_Q_QUERY ].dwActuals = 0; cmdOptions[ ID_Q_QUERY ].dwFlags = 0; cmdOptions[ ID_Q_QUERY ].pValue = &m_bQuery; cmdOptions[ ID_Q_QUERY ].dwLength = 0;
// -s (servername)
StringCopyA( cmdOptions[ ID_Q_SERVER ].szSignature, "PARSER2\0", 8 ); cmdOptions[ ID_Q_SERVER ].dwType = CP_TYPE_TEXT; cmdOptions[ ID_Q_SERVER ].pwszOptions = szServerNameOption; cmdOptions[ ID_Q_SERVER ].dwCount = 1; cmdOptions[ ID_Q_SERVER ].dwActuals = 0; cmdOptions[ ID_Q_SERVER ].dwFlags = CP2_ALLOCMEMORY|CP2_VALUE_TRIMINPUT|CP2_VALUE_NONULL; cmdOptions[ ID_Q_SERVER ].pValue = NULL; //m_pszServerName
cmdOptions[ ID_Q_SERVER ].dwLength = 0;
// -u (username)
StringCopyA( cmdOptions[ ID_Q_USERNAME ].szSignature, "PARSER2\0", 8 ); cmdOptions[ ID_Q_USERNAME ].dwType = CP_TYPE_TEXT; cmdOptions[ ID_Q_USERNAME ].pwszOptions = szUserNameOption; cmdOptions[ ID_Q_USERNAME ].dwCount = 1; cmdOptions[ ID_Q_USERNAME ].dwActuals = 0; cmdOptions[ ID_Q_USERNAME ].dwFlags = CP2_ALLOCMEMORY|CP2_VALUE_TRIMINPUT|CP2_VALUE_NONULL; cmdOptions[ ID_Q_USERNAME ].pValue = NULL; //m_pszUserName
cmdOptions[ ID_Q_USERNAME ].dwLength = 0;
// -p (password)
StringCopyA( cmdOptions[ ID_Q_PASSWORD ].szSignature, "PARSER2\0", 8 ); cmdOptions[ ID_Q_PASSWORD ].dwType = CP_TYPE_TEXT; cmdOptions[ ID_Q_PASSWORD ].pwszOptions = szPasswordOption; cmdOptions[ ID_Q_PASSWORD ].dwCount = 1; cmdOptions[ ID_Q_PASSWORD ].dwActuals = 0; cmdOptions[ ID_Q_PASSWORD ].dwFlags = CP2_ALLOCMEMORY | CP2_VALUE_OPTIONAL; cmdOptions[ ID_Q_PASSWORD ].pValue = NULL; //m_pszPassword
cmdOptions[ ID_Q_PASSWORD ].dwLength = 0;
// -fo
StringCopyA( cmdOptions[ ID_Q_FORMAT ].szSignature, "PARSER2\0", 8 ); cmdOptions[ ID_Q_FORMAT ].dwType = CP_TYPE_TEXT; cmdOptions[ ID_Q_FORMAT ].pwszOptions = szFormatOption; cmdOptions[ ID_Q_FORMAT ].pwszValues = GetResString(IDS_FORMAT_OPTIONS); cmdOptions[ ID_Q_FORMAT ].dwCount = 1; cmdOptions[ ID_Q_FORMAT ].dwActuals = 0; cmdOptions[ ID_Q_FORMAT ].dwFlags = CP2_MODE_VALUES | CP2_VALUE_TRIMINPUT| CP2_VALUE_NONULL | CP2_ALLOCMEMORY; cmdOptions[ ID_Q_FORMAT ].pValue = NULL; cmdOptions[ ID_Q_FORMAT ].dwLength = MAX_STRING_LENGTH;
// -nh
StringCopyA( cmdOptions[ ID_Q_NOHEADER ].szSignature, "PARSER2\0", 8 ); cmdOptions[ ID_Q_NOHEADER ].dwType = CP_TYPE_BOOLEAN; cmdOptions[ ID_Q_NOHEADER ].pwszOptions = szNoHeaderOption; cmdOptions[ ID_Q_NOHEADER ].pwszValues = NULL; cmdOptions[ ID_Q_NOHEADER ].dwCount = 1; cmdOptions[ ID_Q_NOHEADER ].dwActuals = 0; cmdOptions[ ID_Q_NOHEADER ].dwFlags = 0; cmdOptions[ ID_Q_NOHEADER ].pValue = &m_bNoHeader;
// -v verbose
StringCopyA( cmdOptions[ ID_Q_VERBOSE ].szSignature, "PARSER2\0", 8 ); cmdOptions[ ID_Q_VERBOSE ].dwType = CP_TYPE_BOOLEAN; cmdOptions[ ID_Q_VERBOSE ].pwszOptions = szVerboseOption; cmdOptions[ ID_Q_VERBOSE ].pwszValues = NULL; cmdOptions[ ID_Q_VERBOSE ].dwCount = 1; cmdOptions[ ID_Q_VERBOSE ].dwActuals = 0; cmdOptions[ ID_Q_VERBOSE ].dwFlags = 0; cmdOptions[ ID_Q_VERBOSE ].pValue = &m_bVerbose; cmdOptions[ ID_Q_VERBOSE ].dwLength = 0;
// -id
StringCopyA( cmdOptions[ ID_Q_TRIGGERID ].szSignature, "PARSER2\0", 8 ); cmdOptions[ ID_Q_TRIGGERID ].dwType = CP_TYPE_TEXT; cmdOptions[ ID_Q_TRIGGERID ].pwszOptions = szTriggerIDOption; cmdOptions[ ID_Q_TRIGGERID ].pwszValues = NULL; cmdOptions[ ID_Q_TRIGGERID ].dwCount = 1; cmdOptions[ ID_Q_TRIGGERID ].dwActuals = 0; cmdOptions[ ID_Q_TRIGGERID ].dwFlags = CP2_ALLOCMEMORY|CP2_VALUE_TRIMINPUT|CP2_VALUE_NONULL; cmdOptions[ ID_Q_TRIGGERID ].pValue = NULL;
DEBUG_INFO; }
void CETQuery::ProcessOption( IN DWORD argc, IN LPCTSTR argv[]) /*++
Routine Description: This function will process/parce the command line options.
Arguments: [ in ] argc : argument(s) count specified at the command prompt [ in ] argv : argument(s) specified at the command prompt
Return Value: TRUE : On Successful FALSE : On Error
--*/ { // local variable
BOOL bReturn = TRUE; CHString szTempString; DEBUG_INFO; PrepareCMDStruct ();
// do the actual parsing of the command line arguments and check the result
bReturn = DoParseParam2( argc, argv, ID_Q_QUERY, MAX_COMMANDLINE_Q_OPTION, cmdOptions ,0);
// Take values from 'cmdOptions' structure
m_pszServerName = (LPWSTR)cmdOptions[ ID_Q_SERVER ].pValue; m_pszUserName = (LPWSTR)cmdOptions[ ID_Q_USERNAME ].pValue; m_pszPassword = (LPWSTR)cmdOptions[ ID_Q_PASSWORD ].pValue; m_pszFormat = (LPWSTR)cmdOptions[ ID_Q_FORMAT ].pValue; m_pszTriggerID = (LPWSTR)cmdOptions[ ID_Q_TRIGGERID ].pValue; if( FALSE == bReturn) { throw CShowError(MK_E_SYNTAX); } DEBUG_INFO;
// "-p" should not be specified without -u
if ( (0 == cmdOptions[ID_Q_USERNAME].dwActuals) && (0 != cmdOptions[ID_Q_PASSWORD].dwActuals )) { // invalid syntax
throw CShowError(IDS_USERNAME_REQUIRED); }
DEBUG_INFO; if( (1 == cmdOptions[ID_Q_TRIGGERID].dwActuals) && (FALSE == GetNValidateTriggerId( &m_dwLowerBound, &m_dwUpperBound ))) { throw CShowError(IDS_INVALID_RANGE);
}
// check the remote connectivity information
if ( m_pszServerName != NULL ) { //
// if -u is not specified, we need to allocate memory
// in order to be able to retrive the current user name
//
// case 1: -p is not at all specified
// as the value for this switch is optional, we have to rely
// on the dwActuals to determine whether the switch is specified or not
// in this case utility needs to try to connect first and if it fails
// then prompt for the password -- in fact, we need not check for this
// condition explicitly except for noting that we need to prompt for the
// password
//
// case 2: -p is specified
// but we need to check whether the value is specified or not
// in this case user wants the utility to prompt for the password
// before trying to connect
//
// case 3: -p * is specified
// user name
if ( m_pszUserName == NULL ) { DEBUG_INFO; m_pszUserName = (LPTSTR) AllocateMemory( MAX_STRING_LENGTH * sizeof( WCHAR ) ); if ( m_pszUserName == NULL ) { SaveLastError(); throw CShowError(E_OUTOFMEMORY); } DEBUG_INFO; }
// password
if ( m_pszPassword == NULL ) { m_bNeedPassword = TRUE; m_pszPassword = (LPTSTR)AllocateMemory( MAX_STRING_LENGTH * sizeof( WCHAR ) ); if ( m_pszPassword == NULL ) { SaveLastError(); throw CShowError(E_OUTOFMEMORY); } }
// case 1
if ( cmdOptions[ ID_Q_PASSWORD ].dwActuals == 0 ) { // we need not do anything special here
}
// case 2
else if ( cmdOptions[ ID_Q_PASSWORD ].pValue == NULL ) { StringCopy( m_pszPassword, L"*", SIZE_OF_DYN_ARRAY(m_pszPassword)); }
// case 3
else if ( StringCompare( m_pszPassword, L"*", TRUE, 0 ) == 0 ) { if ( ReallocateMemory( (LPVOID*)&m_pszPassword, MAX_STRING_LENGTH * sizeof( WCHAR ) ) == FALSE ) { SaveLastError(); throw CShowError(E_OUTOFMEMORY); }
// ...
m_bNeedPassword = TRUE; } } DEBUG_INFO; if((TRUE == m_bNoHeader) &&(1 == cmdOptions[ ID_Q_FORMAT ].dwActuals) && (0 == StringCompare(m_pszFormat,GetResString(IDS_STRING_LIST),TRUE,0))) { throw CShowError(IDS_HEADER_NOT_ALLOWED); }
if (m_pszTriggerID && (((0 != cmdOptions[ID_Q_TRIGGERID].dwActuals) && (0 == StringLength( m_pszTriggerID,0))) || (0 == StringCompare( m_pszTriggerID,_T("0"),FALSE,0)))) { DEBUG_INFO; throw CShowError(IDS_INVALID_ID); }
}
void CETQuery::Initialize() /*++
Routine Description: This function will allocate memory to variables and also checks it and fills variable with value ZERO.
Arguments: None Return Value: None
--*/ { // if at all any occurs, we know that is 'coz of the
// failure in memory allocation ... so set the error
SetLastError( ERROR_OUTOFMEMORY ); SaveLastError(); DEBUG_INFO; SecureZeroMemory(m_szBuffer,sizeof(m_szBuffer)); SecureZeroMemory(m_szEventDesc,sizeof(m_szEventDesc)); SecureZeroMemory(m_szTask,sizeof(m_szTask)); SecureZeroMemory(m_szTaskUserName,sizeof(m_szTaskUserName)); SecureZeroMemory(m_szScheduleTaskName,sizeof(m_szScheduleTaskName));
m_pszEventQuery = new TCHAR[(m_lQueryColWidth)]; CheckAndSetMemoryAllocation (m_pszEventQuery,(m_lQueryColWidth));
m_arrColData = CreateDynamicArray(); if( NULL == m_arrColData) { throw CShowError(E_OUTOFMEMORY); }
SecureZeroMemory(cmdOptions, sizeof(TCMDPARSER2)* MAX_COMMANDLINE_Q_OPTION);
// initialization is successful
SetLastError( NOERROR ); // clear the error
SetReason( L"" ); // clear the reason
DEBUG_INFO;
}
void CETQuery::CheckAndSetMemoryAllocation( IN OUT LPTSTR pszStr, IN LONG lSize ) /*++
Routine Description: Function will allocate memory to a string
Arguments: [in][out] pszStr : String variable to which memory to be allocated [in] : Number of bytes to be allocated. Return Value: NONE
--*/ { if( NULL == pszStr) { throw CShowError(E_OUTOFMEMORY); } // init to ZERO's
SecureZeroMemory( pszStr, lSize * sizeof( TCHAR ) ); return;
}
BOOL CETQuery::ExecuteQuery() /*++
Routine Description: This function will execute query. This will enumerate classes from WMI to get required data.
Arguments: None Return Value: None
--*/ { // Local variables
// Holds values returned by COM functions
HRESULT hr = S_OK;
// status of Return value of this function.
BOOL bReturn = TRUE;
// stores FORMAT status values to show results
DWORD dwFormatType;
// COM related pointer variable. their usage is well understood by their
//names.
IEnumWbemClassObject *pEnumFilterToConsumerBinding = NULL;
// variable used to get values from COM functions
VARIANT vVariant;
// Variables to store query results....
TCHAR szHostName[MAX_STRING_LENGTH+1]; TCHAR szEventTriggerName[MAX_TRIGGER_NAME]; DWORD dwEventId = 0;
HRESULT hrTemp = S_OK;
// store Row number.
DWORD dwRowCount = 0; BOOL bAtLeastOneEvent = FALSE;
BSTR bstrConsumer = NULL; BSTR bstrFilter = NULL; BSTR bstrCmdTrigger = NULL; BOOL bAlwaysTrue = TRUE;
LONG lTemp = 0;
try { DEBUG_INFO; InitializeCom(&m_pWbemLocator); m_bIsCOMInitialize = TRUE; { // Temp. variabe to store user name.
CHString szTempUser = m_pszUserName;
// Temp. variable to store password.
CHString szTempPassword = m_pszPassword; m_bLocalSystem = TRUE;
DEBUG_INFO; // Connect remote / local WMI.
BOOL bResult = ConnectWmiEx( m_pWbemLocator, &m_pWbemServices, m_pszServerName, szTempUser, szTempPassword, &m_pAuthIdentity, m_bNeedPassword, WMI_NAMESPACE_CIMV2, &m_bLocalSystem); if( FALSE == bResult) { DEBUG_INFO; SAFE_RELEASE_INTERFACE(pEnumFilterToConsumerBinding); ShowLastErrorEx(stderr,SLE_TYPE_ERROR|SLE_INTERNAL); return FALSE; } DEBUG_INFO; // check the remote system version and its compatiblity
if ( FALSE == m_bLocalSystem) { DWORD dwVersion = 0; DEBUG_INFO; dwVersion = GetTargetVersionEx( m_pWbemServices, m_pAuthIdentity ); if ( dwVersion <= 5000 ) // to block win2k versions
{ DEBUG_INFO; SAFE_RELEASE_INTERFACE(pEnumFilterToConsumerBinding); SetReason( E_REMOTE_INCOMPATIBLE ); ShowLastErrorEx(stderr,SLE_TYPE_ERROR|SLE_INTERNAL); return FALSE; } // For XP systems.
if( 5001 == dwVersion ) { if( TRUE == DisplayXPResults() ) { SAFE_RELEASE_INTERFACE(pEnumFilterToConsumerBinding); // Displayed triggers present.
return TRUE; } else { SAFE_RELEASE_INTERFACE(pEnumFilterToConsumerBinding); // Failed to display results .
// Error message is already displayed.
return FALSE; }
}
}
DEBUG_INFO; // check the local credentials and if need display warning
if ( m_bLocalSystem && ( 0 != StringLength(m_pszUserName,0))) { DEBUG_INFO; WMISaveError( WBEM_E_LOCAL_CREDENTIALS ); ShowLastErrorEx(stderr,SLE_TYPE_WARNING|SLE_INTERNAL); } }
// If query is for remote system, make a connection to it so
// that ITaskScheduler will use this connection to get
// application name.
DEBUG_INFO; if( FALSE == m_bLocalSystem) { if( FALSE == EstablishConnection( m_pszServerName, m_pszUserName, GetBufferSize((LPVOID)m_pszUserName)/sizeof(WCHAR), m_pszPassword, GetBufferSize((LPVOID)m_pszPassword)/sizeof(WCHAR), FALSE )) { SAFE_RELEASE_INTERFACE(pEnumFilterToConsumerBinding); ShowLastErrorEx(stderr,SLE_TYPE_ERROR|SLE_INTERNAL); return FALSE; } }
DEBUG_INFO; // Password is not needed , better to free it
FreeMemory((LPVOID*)& m_pszPassword); if(FALSE == SetTaskScheduler()) { SAFE_RELEASE_INTERFACE(pEnumFilterToConsumerBinding); return FALSE; } DEBUG_INFO; // if -id switch is specified
if( (1 == cmdOptions[ ID_Q_TRIGGERID ].dwActuals) && (StringLength( m_pszTriggerID,0) > 0 )) {
IEnumWbemClassObject *pEnumCmdTriggerConsumer = NULL; TCHAR szTemp[ MAX_STRING_LENGTH ]; SecureZeroMemory(szTemp, MAX_STRING_LENGTH); StringCchPrintfW( szTemp,SIZE_OF_ARRAY(szTemp), QUERY_RANGE, m_dwLowerBound, m_dwUpperBound ); DEBUG_INFO; hr = m_pWbemServices-> ExecQuery( _bstr_t(QUERY_LANGUAGE), _bstr_t(szTemp), WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumCmdTriggerConsumer );
ON_ERROR_THROW_EXCEPTION(hr); DEBUG_INFO; hr = SetInterfaceSecurity( pEnumCmdTriggerConsumer, m_pAuthIdentity ); ON_ERROR_THROW_EXCEPTION(hr); DEBUG_INFO;
// retrieves CmdTriggerConsumer class
bstrCmdTrigger = SysAllocString(CLS_TRIGGER_EVENT_CONSUMER); DEBUG_INFO; hr = m_pWbemServices->GetObject(bstrCmdTrigger, 0, NULL, &m_pClass, NULL); SAFE_RELEASE_BSTR(bstrCmdTrigger); ON_ERROR_THROW_EXCEPTION(hr); DEBUG_INFO;
// Gets information about the "QueryETrigger( " method of
// "cmdTriggerConsumer" class
bstrCmdTrigger = SysAllocString(FN_QUERY_ETRIGGER); hr = m_pClass->GetMethod(bstrCmdTrigger, 0, &m_pInClass, NULL); SAFE_RELEASE_BSTR(bstrCmdTrigger); ON_ERROR_THROW_EXCEPTION(hr); DEBUG_INFO;
// create a new instance of a class "TriggerEventConsumer ".
hr = m_pInClass->SpawnInstance(0, &m_pInInst); ON_ERROR_THROW_EXCEPTION(hr);
DEBUG_INFO; while(bAlwaysTrue) { hrTemp = S_OK; ULONG uReturned = 0; BSTR bstrTemp = NULL; CHString strTemp;
hr = SetInterfaceSecurity( pEnumCmdTriggerConsumer, m_pAuthIdentity );
ON_ERROR_THROW_EXCEPTION(hr); DEBUG_INFO;
// Get one object starting at the current position in an
//enumeration
hr = pEnumCmdTriggerConsumer->Next(WBEM_INFINITE, 1,&m_pObj,&uReturned); ON_ERROR_THROW_EXCEPTION(hr); DEBUG_INFO; if( 0 == uReturned) { SAFE_RELEASE_INTERFACE(m_pObj); break; }
bstrTemp = SysAllocString(FPR_TRIGGER_ID); hr = m_pObj->Get(bstrTemp, 0, &vVariant, 0, 0); if(FAILED(hr)) { if( WBEM_E_NOT_FOUND == hr) { continue; } ON_ERROR_THROW_EXCEPTION(hr); } SAFE_RELEASE_BSTR(bstrTemp); DEBUG_INFO; dwEventId = vVariant.lVal ; hr = VariantClear(&vVariant); ON_ERROR_THROW_EXCEPTION(hr);
// Retrieves the "TaskScheduler" information
bstrTemp = SysAllocString(FPR_TASK_SCHEDULER); hr = m_pObj->Get(bstrTemp, 0, &vVariant, 0, 0); ON_ERROR_THROW_EXCEPTION(hr); DEBUG_INFO; SAFE_RELEASE_BSTR(bstrTemp); hrTemp = GetRunAsUserName((LPCWSTR)_bstr_t(vVariant.bstrVal)); if (FAILED(hrTemp) && (ERROR_TRIGGER_CORRUPTED != hrTemp)) { // This is because user does not has enough rights
// to see schtasks. Continue with next trigger.
SAFE_RELEASE_INTERFACE(m_pObj); SAFE_RELEASE_INTERFACE(m_pTriggerEventConsumer); SAFE_RELEASE_INTERFACE(m_pEventFilter); continue; } StringCopy(m_szScheduleTaskName,(LPCWSTR)_bstr_t(vVariant.bstrVal),SIZE_OF_ARRAY(m_szScheduleTaskName));
hr = VariantClear(&vVariant); ON_ERROR_THROW_EXCEPTION(hr);
// TriggerName
//retrieves the 'TriggerName' value if exits
bstrTemp = SysAllocString(FPR_TRIGGER_NAME); hr = m_pObj->Get(bstrTemp, 0, &vVariant, 0, 0); ON_ERROR_THROW_EXCEPTION(hr); SAFE_RELEASE_BSTR(bstrTemp); StringCopy(szEventTriggerName,vVariant.bstrVal,MAX_RES_STRING); hr = VariantClear(&vVariant); ON_ERROR_THROW_EXCEPTION(hr);
//retrieves the 'TriggerDesc' value if exits
bstrTemp = SysAllocString(FPR_TRIGGER_DESC); hr = m_pObj->Get(bstrTemp, 0, &vVariant, 0, 0); ON_ERROR_THROW_EXCEPTION(hr);
SAFE_RELEASE_BSTR(bstrTemp);
StringCopy(m_szBuffer,(_TCHAR*)_bstr_t(vVariant.bstrVal), SIZE_OF_ARRAY(m_szBuffer)); lTemp = StringLength(m_szBuffer,0); DEBUG_INFO;
StringCopy(m_szEventDesc,m_szBuffer, SIZE_OF_ARRAY(m_szEventDesc)); hr = VariantClear(&vVariant); ON_ERROR_THROW_EXCEPTION(hr); DEBUG_INFO;
// Host Name
//retrieves the '__SERVER' value if exits
bstrTemp = SysAllocString(L"__SERVER"); hr = m_pObj->Get(bstrTemp, 0, &vVariant, 0, 0); ON_ERROR_THROW_EXCEPTION(hr); SAFE_RELEASE_BSTR(bstrTemp); StringCopy(szHostName, vVariant.bstrVal,SIZE_OF_ARRAY(szHostName)); DEBUG_INFO;
DEBUG_INFO; if (ERROR_TRIGGER_CORRUPTED != hrTemp) { //retrieves the 'Action' value if exits
hr = GetApplicationToRun(); ON_ERROR_THROW_EXCEPTION(hr); DEBUG_INFO;
/*
bstrTemp = SysAllocString(L"Action"); hr = m_pObj->Get(bstrTemp, 0, &vVariant, 0, 0); ON_ERROR_THROW_EXCEPTION(hr); SAFE_RELEASE_BSTR(bstrTemp);
StringCopy(m_szBuffer,(_TCHAR*)_bstr_t(vVariant.bstrVal), SIZE_OF_ARRAY(m_szBuffer));
lTemp = StringLength(m_szBuffer,0);
StringCopy(m_szTask, m_szBuffer, SIZE_OF_ARRAY(m_szTask)); hr = VariantClear(&vVariant); ON_ERROR_THROW_EXCEPTION(hr); */
StringCopy(szTemp,L"",SIZE_OF_ARRAY(szTemp)); StringCchPrintfW( szTemp, SIZE_OF_ARRAY(szTemp), BINDING_CLASS_QUERY, dwEventId);
DEBUG_INFO; hr = m_pWbemServices->ExecQuery( _bstr_t(QUERY_LANGUAGE), _bstr_t(szTemp), WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumFilterToConsumerBinding);
ON_ERROR_THROW_EXCEPTION(hr); DEBUG_INFO;
hr = SetInterfaceSecurity( pEnumFilterToConsumerBinding, m_pAuthIdentity );
ON_ERROR_THROW_EXCEPTION(hr); DEBUG_INFO;
// Get one object starting at the current position in an
//enumeration
SAFE_RELEASE_INTERFACE(m_pClass); hr = pEnumFilterToConsumerBinding->Next(WBEM_INFINITE, 1,&m_pClass,&uReturned); ON_ERROR_THROW_EXCEPTION(hr); DEBUG_INFO; if( 0 == uReturned ) { SAFE_RELEASE_INTERFACE(pEnumFilterToConsumerBinding); SAFE_RELEASE_INTERFACE(m_pObj); SAFE_RELEASE_INTERFACE(m_pTriggerEventConsumer); SAFE_RELEASE_INTERFACE(m_pEventFilter); continue; }
DEBUG_INFO; bstrTemp = SysAllocString(L"Filter"); hr = m_pClass->Get(bstrTemp, 0, &vVariant, 0, 0); SAFE_RELEASE_BSTR(bstrTemp); ON_ERROR_THROW_EXCEPTION(hr); bstrFilter = SysAllocString(vVariant.bstrVal); hr = VariantClear(&vVariant); ON_ERROR_THROW_EXCEPTION(hr); DEBUG_INFO; hr = m_pWbemServices->GetObject( bstrFilter, 0, NULL, &m_pEventFilter, NULL); SAFE_RELEASE_BSTR(bstrFilter); DEBUG_INFO; if(FAILED(hr)) { if( WBEM_E_NOT_FOUND == hr) continue; ON_ERROR_THROW_EXCEPTION(hr); }
DEBUG_INFO; hr = VariantClear(&vVariant); ON_ERROR_THROW_EXCEPTION(hr); bstrTemp = SysAllocString(L"Query"); hr = m_pEventFilter->Get(bstrTemp, 0, &vVariant, 0, 0); SAFE_RELEASE_BSTR(bstrTemp); ON_ERROR_THROW_EXCEPTION(hr); StringCopy(m_szBuffer,(_TCHAR*)_bstr_t(vVariant.bstrVal), SIZE_OF_ARRAY(m_szBuffer)); hr = VariantClear(&vVariant); ON_ERROR_THROW_EXCEPTION(hr); DEBUG_INFO;
FindAndReplace(m_szBuffer,QUERY_STRING_AND,SHOW_WQL_QUERY); FindAndReplace(m_szBuffer,L"targetinstance.LogFile",L"Log"); FindAndReplace(m_szBuffer,L"targetinstance.Type",L"Type"); FindAndReplace(m_szBuffer,L"targetinstance.EventCode",L"Id"); FindAndReplace(m_szBuffer, L"targetinstance.SourceName",L"Source");
DEBUG_INFO; // Remove extra spaces
FindAndReplace( m_szBuffer,L" ",L" ");
// Remove extra spaces
FindAndReplace(m_szBuffer,L" ",L" ");
lTemp = StringLength(m_szBuffer,0);
// for the safer size for allocation of memory.
// allocates memory only if new WQL is greate than previous one.
lTemp += 4;
if(lTemp > m_lWQLColWidth) { DEBUG_INFO; // first free it (if previously allocated)
RELEASE_MEMORY_EX(m_pszEventQuery); m_pszEventQuery = new TCHAR[lTemp+1]; CheckAndSetMemoryAllocation(m_pszEventQuery,lTemp); } lTemp = m_lWQLColWidth; CalcColWidth(lTemp,&m_lWQLColWidth,m_szBuffer);
// Now manipulate the WQL string to get EventQuery....
FindAndReplace(m_szBuffer,SHOW_WQL_QUERY, GetResString(IDS_EVENTS_WITH));
//to remove extra spaces
FindAndReplace(m_szBuffer,L" ",L" ");
//to remove extra spaces
FindAndReplace( m_szBuffer,L" ",L" "); StringCopy( m_pszEventQuery,m_szBuffer, SIZE_OF_NEW_ARRAY(m_pszEventQuery));
DEBUG_INFO;
} else { StringCopy(m_szTask,TRIGGER_CORRUPTED,SIZE_OF_ARRAY(m_szTask));
// first free it (if previously allocated)
RELEASE_MEMORY_EX(m_pszEventQuery); m_pszEventQuery = new TCHAR[MAX_STRING_LENGTH]; CheckAndSetMemoryAllocation(m_pszEventQuery,MAX_STRING_LENGTH);
StringCopy(m_pszEventQuery,GetResString(IDS_ID_NA),SIZE_OF_NEW_ARRAY(m_pszEventQuery)); StringCopy(m_szTaskUserName,GetResString(IDS_ID_NA),SIZE_OF_ARRAY(m_szTaskUserName)); }
// Now Shows the results on screen
// Appends for in m_arrColData array
dwRowCount = DynArrayAppendRow( m_arrColData, NO_OF_COLUMNS );
// Fills Results in m_arrColData data structure
DynArraySetString2( m_arrColData, dwRowCount, HOST_NAME, szHostName,0); DynArraySetDWORD2( m_arrColData , dwRowCount, TRIGGER_ID,dwEventId); DynArraySetString2( m_arrColData, dwRowCount, TRIGGER_NAME, szEventTriggerName,0); DynArraySetString2( m_arrColData, dwRowCount, TASK, m_szTask,0); DynArraySetString2( m_arrColData, dwRowCount, EVENT_QUERY, m_pszEventQuery,0); DynArraySetString2( m_arrColData, dwRowCount, EVENT_DESCRIPTION, m_szEventDesc,0); DynArraySetString2( m_arrColData, dwRowCount, TASK_USERNAME, m_szTaskUserName,0);
bAtLeastOneEvent = TRUE;
// Calculatate new column width for each column
lTemp = m_lHostNameColWidth; CalcColWidth(lTemp,&m_lHostNameColWidth,szHostName);
lTemp = m_lETNameColWidth; CalcColWidth(lTemp,&m_lETNameColWidth,szEventTriggerName);
lTemp = m_lTaskColWidth; CalcColWidth(lTemp,&m_lTaskColWidth,m_szTask);
lTemp = m_lQueryColWidth; CalcColWidth(lTemp,&m_lQueryColWidth,m_pszEventQuery);
lTemp = m_lDescriptionColWidth; CalcColWidth(lTemp,&m_lDescriptionColWidth,m_szEventDesc);
// Resets current containts..if any
StringCopy(szHostName, L"",SIZE_OF_ARRAY(szHostName)); dwEventId = 0; StringCopy(szEventTriggerName,L"",SIZE_OF_ARRAY(szEventTriggerName)); StringCopy( m_szTask, L"", SIZE_OF_ARRAY(m_szTask)); StringCopy(m_pszEventQuery,L"",SIZE_OF_NEW_ARRAY(m_pszEventQuery)); StringCopy(m_szEventDesc,L"",SIZE_OF_ARRAY(m_szEventDesc)); SAFE_RELEASE_INTERFACE(m_pObj); SAFE_RELEASE_INTERFACE(m_pTriggerEventConsumer); SAFE_RELEASE_INTERFACE(m_pEventFilter);
DEBUG_INFO; } } else {
//Following method will creates an enumerator that returns the
// instances of a specified __FilterToConsumerBinding class
bstrConsumer = SysAllocString(CLS_FILTER_TO_CONSUMERBINDING); DEBUG_INFO; hr = m_pWbemServices-> CreateInstanceEnum(bstrConsumer, WBEM_FLAG_SHALLOW, NULL, &pEnumFilterToConsumerBinding); SAFE_RELEASE_BSTR(bstrConsumer); ON_ERROR_THROW_EXCEPTION(hr); DEBUG_INFO;
hr = SetInterfaceSecurity( pEnumFilterToConsumerBinding, m_pAuthIdentity ); ON_ERROR_THROW_EXCEPTION(hr);
// retrieves CmdTriggerConsumer class
bstrCmdTrigger = SysAllocString(CLS_TRIGGER_EVENT_CONSUMER); hr = m_pWbemServices->GetObject(bstrCmdTrigger, 0, NULL, &m_pClass, NULL); SAFE_RELEASE_BSTR(bstrCmdTrigger); ON_ERROR_THROW_EXCEPTION(hr); DEBUG_INFO;
// Gets information about the "QueryETrigger( " method of
// "cmdTriggerConsumer" class
bstrCmdTrigger = SysAllocString(FN_QUERY_ETRIGGER); hr = m_pClass->GetMethod(bstrCmdTrigger, 0, &m_pInClass, NULL); SAFE_RELEASE_BSTR(bstrCmdTrigger); ON_ERROR_THROW_EXCEPTION(hr); DEBUG_INFO;
// create a new instance of a class "TriggerEventConsumer ".
hr = m_pInClass->SpawnInstance(0, &m_pInInst); ON_ERROR_THROW_EXCEPTION(hr);
while(bAlwaysTrue) { // Holds no. of object returns from Next mathod.
ULONG uReturned = 0;
BSTR bstrTemp = NULL; CHString strTemp;
// set the security at the interface level also
hr = SetInterfaceSecurity( pEnumFilterToConsumerBinding, m_pAuthIdentity );
ON_ERROR_THROW_EXCEPTION(hr);
// Get one object starting at the current position in an
//enumeration
hr = pEnumFilterToConsumerBinding->Next(WBEM_INFINITE, 1,&m_pObj,&uReturned); ON_ERROR_THROW_EXCEPTION(hr); if( 0 == uReturned ) { SAFE_RELEASE_INTERFACE(m_pObj); break; } DEBUG_INFO; VariantInit(&vVariant); SAFE_RELEASE_BSTR(bstrTemp); bstrTemp = SysAllocString(L"Consumer"); hr = m_pObj->Get(bstrTemp, 0, &vVariant, 0, 0); SAFE_RELEASE_BSTR(bstrTemp); ON_ERROR_THROW_EXCEPTION(hr);
bstrConsumer =SysAllocString( vVariant.bstrVal); hr = VariantClear(&vVariant); ON_ERROR_THROW_EXCEPTION(hr);
// Search for trggereventconsumer string as we are interested
// to get object from this class only
strTemp = bstrConsumer; if( -1 == strTemp.Find(CLS_TRIGGER_EVENT_CONSUMER)) { SAFE_RELEASE_BSTR(bstrConsumer); continue; } hr = SetInterfaceSecurity( m_pWbemServices, m_pAuthIdentity );
ON_ERROR_THROW_EXCEPTION(hr); DEBUG_INFO; hr = m_pWbemServices->GetObject(bstrConsumer, 0, NULL, &m_pTriggerEventConsumer, NULL); SAFE_RELEASE_BSTR(bstrConsumer); if(FAILED(hr)) { if( WBEM_E_NOT_FOUND == hr) { continue; } ON_ERROR_THROW_EXCEPTION(hr); } DEBUG_INFO; bstrTemp = SysAllocString(L"Filter"); hr = m_pObj->Get(bstrTemp, 0, &vVariant, 0, 0); SAFE_RELEASE_BSTR(bstrTemp); ON_ERROR_THROW_EXCEPTION(hr); bstrFilter = SysAllocString(vVariant.bstrVal); hr = VariantClear(&vVariant); ON_ERROR_THROW_EXCEPTION(hr); hr = m_pWbemServices->GetObject( bstrFilter, 0, NULL, &m_pEventFilter, NULL); SAFE_RELEASE_BSTR(bstrFilter); if(FAILED(hr)) { if( WBEM_E_NOT_FOUND == hr) { continue; } ON_ERROR_THROW_EXCEPTION(hr); } DEBUG_INFO; //retrieves the 'TriggerID' value if exits
bstrTemp = SysAllocString(FPR_TRIGGER_ID); hr = m_pTriggerEventConsumer->Get(bstrTemp, 0, &vVariant, 0, 0); if(FAILED(hr)) { if( WBEM_E_NOT_FOUND == hr) { continue; } ON_ERROR_THROW_EXCEPTION(hr); } SAFE_RELEASE_BSTR(bstrTemp); DEBUG_INFO; dwEventId = vVariant.lVal ; hr = VariantClear(&vVariant); ON_ERROR_THROW_EXCEPTION(hr);
// Retrieves the "TaskScheduler" information
bstrTemp = SysAllocString(FPR_TASK_SCHEDULER); DEBUG_INFO; hr = m_pTriggerEventConsumer->Get(bstrTemp, 0, &vVariant, 0, 0); ON_ERROR_THROW_EXCEPTION(hr); DEBUG_INFO; SAFE_RELEASE_BSTR(bstrTemp); DEBUG_INFO; hrTemp = GetRunAsUserName((LPCWSTR)_bstr_t(vVariant.bstrVal)); DEBUG_INFO; if (FAILED(hrTemp) && (ERROR_TRIGGER_CORRUPTED != hrTemp)) { // This is because user does not has enough rights
// to see schtasks. Continue with next trigger.
DEBUG_INFO; SAFE_RELEASE_INTERFACE(m_pObj); SAFE_RELEASE_INTERFACE(m_pTriggerEventConsumer); SAFE_RELEASE_INTERFACE(m_pEventFilter); continue; } StringCopy(m_szScheduleTaskName,(LPCWSTR)_bstr_t(vVariant.bstrVal),SIZE_OF_ARRAY(m_szScheduleTaskName));
hr = VariantClear(&vVariant); ON_ERROR_THROW_EXCEPTION(hr);
// TriggerName
//retrieves the 'TriggerName' value if exits
bstrTemp = SysAllocString(FPR_TRIGGER_NAME); hr = m_pTriggerEventConsumer->Get(bstrTemp, 0, &vVariant, 0,0); ON_ERROR_THROW_EXCEPTION(hr); SAFE_RELEASE_BSTR(bstrTemp); StringCopy(szEventTriggerName,vVariant.bstrVal,MAX_RES_STRING); hr = VariantClear(&vVariant); ON_ERROR_THROW_EXCEPTION(hr); DEBUG_INFO;
//retrieves the 'TriggerDesc' value if exits
bstrTemp = SysAllocString(FPR_TRIGGER_DESC); hr = m_pTriggerEventConsumer->Get(bstrTemp, 0, &vVariant, 0, 0); ON_ERROR_THROW_EXCEPTION(hr);
SAFE_RELEASE_BSTR(bstrTemp);
StringCopy(m_szBuffer,(_TCHAR*)_bstr_t(vVariant.bstrVal), SIZE_OF_ARRAY(m_szBuffer)); lTemp = StringLength(m_szBuffer,0);
// Means description is not available make it N/A.
if( 0 == lTemp) { StringCopy(m_szBuffer,GetResString(IDS_ID_NA),SIZE_OF_ARRAY(m_szBuffer)); lTemp = StringLength(m_szBuffer,0); }
StringCopy(m_szEventDesc,m_szBuffer,SIZE_OF_ARRAY(m_szEventDesc)); hr = VariantClear(&vVariant); ON_ERROR_THROW_EXCEPTION(hr);
// Host Name
//retrieves the '__SERVER' value if exits
bstrTemp = SysAllocString(L"__SERVER"); hr = m_pTriggerEventConsumer->Get(bstrTemp, 0, &vVariant, 0,0); ON_ERROR_THROW_EXCEPTION(hr); SAFE_RELEASE_BSTR(bstrTemp); StringCopy(szHostName, vVariant.bstrVal,SIZE_OF_ARRAY(szHostName));
if ( ERROR_TRIGGER_CORRUPTED != hrTemp) { hr = GetApplicationToRun(); ON_ERROR_THROW_EXCEPTION(hr); DEBUG_INFO;
/*
//retrieves the 'Action' value if exits
bstrTemp = SysAllocString(L"Action"); hr = m_pTriggerEventConsumer->Get(bstrTemp, 0, &vVariant, 0, 0); ON_ERROR_THROW_EXCEPTION(hr); SAFE_RELEASE_BSTR(bstrTemp);
StringCopy(m_szBuffer,(_TCHAR*)_bstr_t(vVariant.bstrVal), SIZE_OF_ARRAY(m_szBuffer));
StringCopy(m_szTask, m_szBuffer,SIZE_OF_ARRAY(m_szTask)); hr = VariantClear(&vVariant); ON_ERROR_THROW_EXCEPTION(hr);
hr = VariantClear(&vVariant); ON_ERROR_THROW_EXCEPTION(hr); */
bstrTemp = SysAllocString(L"Query"); hr = m_pEventFilter->Get(bstrTemp, 0, &vVariant, 0, 0); SAFE_RELEASE_BSTR(bstrTemp); ON_ERROR_THROW_EXCEPTION(hr); DEBUG_INFO; StringCopy(m_szBuffer,(_TCHAR*)_bstr_t(vVariant.bstrVal), SIZE_OF_ARRAY(m_szBuffer)); hr = VariantClear(&vVariant); ON_ERROR_THROW_EXCEPTION(hr); DEBUG_INFO;
FindAndReplace(m_szBuffer,QUERY_STRING_AND,SHOW_WQL_QUERY); FindAndReplace(m_szBuffer,L"targetinstance.LogFile",L"Log"); FindAndReplace(m_szBuffer,L"targetinstance.Type",L"Type"); FindAndReplace(m_szBuffer,L"targetinstance.EventCode",L"Id"); FindAndReplace(m_szBuffer, L"targetinstance.SourceName",L"Source");
//to remove extra spaces
FindAndReplace(m_szBuffer,L" ",L" ");
//to remove extra spaces
FindAndReplace( m_szBuffer,L" ",L" ");
lTemp = StringLength(m_szBuffer,0);
// for the safer size for allocation of memory.
// allocates memory only if new WQL is greate than previous one.
lTemp += 4; if(lTemp > m_lWQLColWidth) { DEBUG_INFO; // first free it (if previously allocated)
RELEASE_MEMORY_EX(m_pszEventQuery); m_pszEventQuery = new TCHAR[lTemp+1]; CheckAndSetMemoryAllocation(m_pszEventQuery,lTemp); } lTemp = m_lWQLColWidth; CalcColWidth(lTemp,&m_lWQLColWidth,m_szBuffer);
// Now manipulate the WQL string to get EventQuery....
FindAndReplace(m_szBuffer,SHOW_WQL_QUERY, GetResString(IDS_EVENTS_WITH));
// Remove extra spaces.
FindAndReplace(m_szBuffer,L" ",L" ");
// Remove extra spaces.
FindAndReplace(m_szBuffer,L" ",L" "); StringCopy(m_pszEventQuery,m_szBuffer, SIZE_OF_NEW_ARRAY(m_pszEventQuery));
DEBUG_INFO; } else { StringCopy(m_szTask,TRIGGER_CORRUPTED,SIZE_OF_ARRAY(m_szTask));
// first free it (if previously allocated)
RELEASE_MEMORY_EX(m_pszEventQuery); m_pszEventQuery = new TCHAR[MAX_STRING_LENGTH]; CheckAndSetMemoryAllocation(m_pszEventQuery,MAX_STRING_LENGTH);
StringCopy(m_pszEventQuery,GetResString(IDS_ID_NA),SIZE_OF_NEW_ARRAY(m_pszEventQuery)); StringCopy(m_szTaskUserName,GetResString(IDS_ID_NA),SIZE_OF_ARRAY(m_szTaskUserName)); }
// Now Shows the results on screen
// Appends for in m_arrColData array
dwRowCount = DynArrayAppendRow( m_arrColData, NO_OF_COLUMNS ); DEBUG_INFO;
// if hrTemp == ERROR_TRIGGER_CORRUPTED,
// fill all the columns with "Trigger Corrupted except
// Trigger id and Trigger Name
// Fills Results in m_arrColData data structure
DynArraySetString2(m_arrColData,dwRowCount, HOST_NAME,szHostName,0); DynArraySetDWORD2( m_arrColData , dwRowCount, TRIGGER_ID, dwEventId); DynArraySetString2( m_arrColData, dwRowCount, TRIGGER_NAME, szEventTriggerName,0); DynArraySetString2( m_arrColData, dwRowCount, TASK, m_szTask,0); DynArraySetString2( m_arrColData, dwRowCount, EVENT_QUERY, m_pszEventQuery,0); DynArraySetString2( m_arrColData, dwRowCount, EVENT_DESCRIPTION, m_szEventDesc,0); DynArraySetString2( m_arrColData, dwRowCount, TASK_USERNAME, m_szTaskUserName,0);
bAtLeastOneEvent = TRUE;
// Calculatate new column width for each column
lTemp = m_lHostNameColWidth; CalcColWidth(lTemp,&m_lHostNameColWidth,szHostName);
lTemp = m_lETNameColWidth; CalcColWidth(lTemp,&m_lETNameColWidth,szEventTriggerName);
lTemp = m_lTaskColWidth; CalcColWidth(lTemp,&m_lTaskColWidth,m_szTask);
lTemp = m_lQueryColWidth; CalcColWidth(lTemp,&m_lQueryColWidth,m_pszEventQuery);
lTemp = m_lDescriptionColWidth; CalcColWidth(lTemp,&m_lDescriptionColWidth,m_szEventDesc);
// Resets current containts..if any
StringCopy(szHostName, L"",SIZE_OF_ARRAY(szHostName)); dwEventId = 0; StringCopy(szEventTriggerName, L"",SIZE_OF_ARRAY(szEventTriggerName)); StringCopy(m_szTask, L"",SIZE_OF_ARRAY(m_szTask)); StringCopy(m_pszEventQuery, L"",SIZE_OF_NEW_ARRAY(m_pszEventQuery)); StringCopy(m_szEventDesc,L"",SIZE_OF_ARRAY(m_szEventDesc)); SAFE_RELEASE_INTERFACE(m_pObj); SAFE_RELEASE_INTERFACE(m_pTriggerEventConsumer); SAFE_RELEASE_INTERFACE(m_pEventFilter); DEBUG_INFO; } // End of while
} if(0 == StringCompare( m_pszFormat,GetResString(IDS_STRING_TABLE), TRUE,0)) { dwFormatType = SR_FORMAT_TABLE; } else if(0 == StringCompare( m_pszFormat, GetResString(IDS_STRING_LIST),TRUE,0)) { dwFormatType = SR_FORMAT_LIST; } else if(0 == StringCompare( m_pszFormat, GetResString(IDS_STRING_CSV),TRUE,0)) { dwFormatType = SR_FORMAT_CSV; } else // Default
{ dwFormatType = SR_FORMAT_TABLE; } if( TRUE == bAtLeastOneEvent) { // Show Final Query Results on screen
PrepareColumns (); DEBUG_INFO; if ( FALSE == IsSchSvrcRunning()) { DEBUG_INFO; ShowMessage(stderr,GetResString(IDS_SERVICE_NOT_RUNNING)); } if((SR_FORMAT_CSV & dwFormatType) != SR_FORMAT_CSV) { ShowMessage(stdout,BLANK_LINE); } if( TRUE == m_bNoHeader) { dwFormatType |=SR_NOHEADER; }
ShowResults(NO_OF_COLUMNS,mainCols,dwFormatType,m_arrColData); } else if( StringLength(m_pszTriggerID,0)> 0) { // Show Message
TCHAR szErrorMsg[MAX_RES_STRING+1]; TCHAR szMsgFormat[MAX_RES_STRING+1]; StringCopy(szMsgFormat,GetResString(IDS_NO_EVENTID_FOUND), SIZE_OF_ARRAY(szMsgFormat)); StringCchPrintfW(szErrorMsg, SIZE_OF_ARRAY(szErrorMsg), szMsgFormat,m_pszTriggerID); ShowMessage(stdout,szErrorMsg); } else { // Show Message
ShowMessage(stdout,GetResString(IDS_NO_EVENT_FOUNT)); } } catch(_com_error) { DEBUG_INFO; SAFE_RELEASE_INTERFACE(pEnumFilterToConsumerBinding); // WMI returns string for this hr value is "Not Found." which is not
// user friendly. So changing the message text.
if( 0x80041002 == hr ) { ShowMessage( stderr,GetResString(IDS_CLASS_NOT_REG)); } else { DEBUG_INFO; ShowLastErrorEx(stderr,SLE_TYPE_ERROR|SLE_INTERNAL); } return FALSE; } DEBUG_INFO; SAFE_RELEASE_INTERFACE(pEnumFilterToConsumerBinding); return TRUE; }
void CETQuery::PrepareColumns() /*++
Routine Description: This function will prepare/fill structure which will be used to show output data.
Arguments: None Return Value: None
--*/ {
DEBUG_INFO; // For non verbose mode output, column width is predefined else
// use dynamically calculated column width.
m_lETNameColWidth = m_bVerbose?m_lETNameColWidth:V_WIDTH_TRIG_NAME; m_lTaskColWidth = m_bVerbose?m_lTaskColWidth:V_WIDTH_TASK; m_lTriggerIDColWidth = m_bVerbose?m_lTriggerIDColWidth:V_WIDTH_TRIG_ID;
StringCopy(mainCols[HOST_NAME].szColumn,COL_HOSTNAME,SIZE_OF_ARRAY(mainCols[HOST_NAME].szColumn)); mainCols[HOST_NAME].dwWidth = m_lHostNameColWidth; if( TRUE == m_bVerbose) { mainCols[HOST_NAME].dwFlags = SR_TYPE_STRING; } else { mainCols[HOST_NAME].dwFlags = SR_HIDECOLUMN|SR_TYPE_STRING; }
StringCopy(mainCols[HOST_NAME].szFormat,L"%s",SIZE_OF_ARRAY(mainCols[HOST_NAME].szFormat)); mainCols[HOST_NAME].pFunction = NULL; mainCols[HOST_NAME].pFunctionData = NULL;
StringCopy(mainCols[TRIGGER_ID].szColumn,COL_TRIGGER_ID,SIZE_OF_ARRAY(mainCols[TRIGGER_ID].szColumn)); mainCols[TRIGGER_ID].dwWidth = m_lTriggerIDColWidth; mainCols[TRIGGER_ID].dwFlags = SR_TYPE_NUMERIC; StringCopy(mainCols[TRIGGER_ID].szFormat,L"%d",SIZE_OF_ARRAY(mainCols[TRIGGER_ID].szFormat)); mainCols[TRIGGER_ID].pFunction = NULL; mainCols[TRIGGER_ID].pFunctionData = NULL;
StringCopy(mainCols[TRIGGER_NAME].szColumn,COL_TRIGGER_NAME, SIZE_OF_ARRAY(mainCols[TRIGGER_NAME].szColumn)); mainCols[TRIGGER_NAME].dwWidth = m_lETNameColWidth; mainCols[TRIGGER_NAME].dwFlags = SR_TYPE_STRING; StringCopy(mainCols[TRIGGER_NAME].szFormat,L"%s", SIZE_OF_ARRAY(mainCols[TRIGGER_NAME].szFormat)); mainCols[TRIGGER_NAME].pFunction = NULL; mainCols[TRIGGER_NAME].pFunctionData = NULL;
StringCopy(mainCols[TASK].szColumn,COL_TASK, SIZE_OF_ARRAY(mainCols[TASK].szColumn)); mainCols[TASK].dwWidth = m_lTaskColWidth;
mainCols[TASK].dwFlags = SR_TYPE_STRING; StringCopy(mainCols[TASK].szFormat,L"%s", SIZE_OF_ARRAY(mainCols[TASK].szFormat)); mainCols[TASK].pFunction = NULL; mainCols[TASK].pFunctionData = NULL;
StringCopy(mainCols[EVENT_QUERY].szColumn,COL_EVENT_QUERY, SIZE_OF_ARRAY(mainCols[EVENT_QUERY].szColumn)); mainCols[EVENT_QUERY].dwWidth = m_lQueryColWidth; if(TRUE == m_bVerbose) { mainCols[EVENT_QUERY].dwFlags = SR_TYPE_STRING; } else { mainCols[EVENT_QUERY].dwFlags = SR_HIDECOLUMN|SR_TYPE_STRING; }
StringCopy(mainCols[EVENT_QUERY].szFormat,L"%s", SIZE_OF_ARRAY(mainCols[EVENT_QUERY].szFormat)); mainCols[EVENT_QUERY].pFunction = NULL; mainCols[EVENT_QUERY].pFunctionData = NULL;
StringCopy(mainCols[EVENT_DESCRIPTION].szColumn,COL_DESCRIPTION, SIZE_OF_ARRAY(mainCols[EVENT_DESCRIPTION].szColumn)); mainCols[EVENT_DESCRIPTION].dwWidth = m_lDescriptionColWidth; if( TRUE == m_bVerbose ) { mainCols[EVENT_DESCRIPTION].dwFlags = SR_TYPE_STRING; } else { mainCols[EVENT_DESCRIPTION].dwFlags = SR_HIDECOLUMN|SR_TYPE_STRING; }
// Task Username
StringCopy(mainCols[TASK_USERNAME].szFormat,L"%s", SIZE_OF_ARRAY(mainCols[TASK_USERNAME].szFormat)); mainCols[TASK_USERNAME].pFunction = NULL; mainCols[TASK_USERNAME].pFunctionData = NULL;
StringCopy(mainCols[TASK_USERNAME].szColumn,COL_TASK_USERNAME, SIZE_OF_ARRAY(mainCols[TASK_USERNAME].szColumn)); mainCols[TASK_USERNAME].dwWidth = m_lTaskUserName; if( TRUE == m_bVerbose) { mainCols[TASK_USERNAME].dwFlags = SR_TYPE_STRING; } else { mainCols[TASK_USERNAME].dwFlags = SR_HIDECOLUMN|SR_TYPE_STRING; }
StringCopy(mainCols[TASK_USERNAME].szFormat,L"%s", SIZE_OF_ARRAY(mainCols[TASK_USERNAME].szFormat)); mainCols[TASK_USERNAME].pFunction = NULL; mainCols[TASK_USERNAME].pFunctionData = NULL; DEBUG_INFO; }
LONG CETQuery::FindAndReplace( IN OUT LPTSTR lpszSource, IN LPCTSTR lpszFind, IN LPCTSTR lpszReplace ) /*++
Routine Description:
This function Will Find a string (lpszFind) in source string (lpszSource) and replace it with replace string (lpszReplace) for all occurences.
It assumes the input 'lpszSource' is big enough to accomodate replace value.
Arguments:
[in/out] lpszSource : String on which Find-Replace operation to be performed [in] lpszFind : String to be find [in] lpszReplace : String to be replaced. Return Value: 0 - if Unsucessful else returns length of lpszSource.
--*/ { DEBUG_INFO; LONG lSourceLen = StringLength(lpszFind,0); LONG lReplacementLen = StringLength(lpszReplace,0); LONG lMainLength = StringLength(lpszSource,0); LPTSTR pszMainSafe= new TCHAR[StringLength(lpszSource,0)+1];
LONG nCount = 0; LPTSTR lpszStart = NULL; lpszStart = lpszSource; LPTSTR lpszEnd = NULL; lpszEnd = lpszStart + lMainLength; LPTSTR lpszTarget=NULL; if ((0 == lSourceLen)||( NULL == pszMainSafe)) { RELEASE_MEMORY_EX(pszMainSafe); return 0; } while (lpszStart < lpszEnd) { while ( NULL != (lpszTarget = (LPWSTR)FindString(lpszStart, lpszFind,0))) { nCount++; lpszStart = lpszTarget + lSourceLen; } lpszStart += StringLength(lpszStart,0) + 1; }
// if any changes were made, make them
if (nCount > 0) { StringCopy(pszMainSafe,lpszSource,SIZE_OF_NEW_ARRAY(pszMainSafe)); LONG lOldLength = lMainLength;
// else, we just do it in-place
lpszStart= lpszSource; lpszEnd = lpszStart +StringLength(lpszSource,0);
// loop again to actually do the work
while (lpszStart < lpszEnd) { while ( NULL != (lpszTarget = (LPWSTR)FindString(lpszStart, lpszFind,0))) { #ifdef _WIN64
__int64 lBalance ; #else
LONG lBalance; #endif
lBalance = lOldLength - (lpszTarget - lpszStart + lSourceLen); memmove(lpszTarget + lReplacementLen, lpszTarget + lSourceLen, (size_t) lBalance * sizeof(TCHAR)); memcpy(lpszTarget, lpszReplace, lReplacementLen*sizeof(TCHAR)); lpszStart = lpszTarget + lReplacementLen; lpszStart[lBalance] = L'\0'; lOldLength += (lReplacementLen - lSourceLen);
} lpszStart += StringLength(lpszStart,0) + 1; } } RELEASE_MEMORY_EX(pszMainSafe); DEBUG_INFO; return StringLength(lpszSource,0); }
void CETQuery::CalcColWidth( IN LONG lOldLength, OUT LONG *plNewLength, IN LPTSTR pszString) /*++
Routine Description: Calculates the width required for column Arguments:
[in] lOldLength : Previous length [out] plNewLength : New Length [in] pszString : String .
Return Value: none
--*/ { LONG lStrLength = StringLength(pszString,0)+2;
//Any way column width should not be greater than MAX_COL_LENGTH
// Stores the maximum of WQL length.
if(lStrLength > lOldLength) { *plNewLength = lStrLength; } else { *plNewLength = lOldLength; }
}
HRESULT CETQuery::GetRunAsUserName( IN LPCWSTR pszScheduleTaskName, IN BOOL bXPorNET ) /*++
Routine Description: Get User Name from Task Scheduler Arguments: [in] pszScheduleTaskName : Task Name [in] bXPorNET : TRUE if remote machine is XP else .NET.
Return Value: HRESULT --*/ {
// if pszSheduleTaskName is null or 0 length just return N/A.
HRESULT hr = S_OK; BSTR bstrTemp = NULL; VARIANT vVariant;
DEBUG_INFO; if(0 == StringLength(pszScheduleTaskName,0)) { StringCopy(m_szTaskUserName,DEFAULT_USER,SIZE_OF_ARRAY(m_szTaskUserName)); return S_OK; } StringCopy(m_szTaskUserName,GetResString(IDS_ID_NA),SIZE_OF_ARRAY(m_szTaskUserName));
// Put input parameter for QueryETrigger method
hr = PropertyPut(m_pInInst,FPR_TASK_SCHEDULER,_bstr_t(pszScheduleTaskName)); ON_ERROR_THROW_EXCEPTION(hr);
// All The required properties sets, so
// executes DeleteETrigger method to delete eventtrigger
DEBUG_INFO; if( TRUE == bXPorNET ) { hr = m_pWbemServices->ExecMethod(_bstr_t(CLS_TRIGGER_EVENT_CONSUMER), _bstr_t(FN_QUERY_ETRIGGER_XP), 0, NULL, m_pInInst,&m_pOutInst,NULL); } else { hr = m_pWbemServices->ExecMethod(_bstr_t(CLS_TRIGGER_EVENT_CONSUMER), _bstr_t(FN_QUERY_ETRIGGER), 0, NULL, m_pInInst,&m_pOutInst,NULL); } ON_ERROR_THROW_EXCEPTION(hr); DEBUG_INFO;
VARIANT vtValue; // initialize the variant and then get the value of the specified property
VariantInit( &vtValue );
hr = m_pOutInst->Get( _bstr_t( FPR_RETURN_VALUE ), 0, &vtValue, NULL, NULL ); ON_ERROR_THROW_EXCEPTION( hr );
//Get Output paramters.
hr = vtValue.lVal;
// Clear the variant variable
VariantClear( &vtValue );
if (FAILED(hr)) { if (!((ERROR_INVALID_USER == hr) || (ERROR_RUN_AS_USER == hr) || (SCHEDULER_NOT_RUNNING_ERROR_CODE == hr) || (RPC_SERVER_NOT_AVAILABLE == hr) || (ERROR_TRIGGER_NOT_FOUND == hr) || (ERROR_TRIGGER_CORRUPTED) == hr)) { ON_ERROR_THROW_EXCEPTION(hr); }
if( ERROR_INVALID_USER == hr || ERROR_TRIGGER_NOT_FOUND == hr) { // means user doesnot has enough rights to
// see schtask associated to it.
DEBUG_INFO; return E_FAIL; } else if((ERROR_RUN_AS_USER == hr) || (SCHEDULER_NOT_RUNNING_ERROR_CODE == hr) || (RPC_SERVER_NOT_AVAILABLE == hr)) { // This means task scheduler not running, or run as user was set with
// non existing user so while retriving it will throw error.
DEBUG_INFO; StringCopy(m_szTaskUserName,GetResString(IDS_RUNAS_USER_UNKNOWN), SIZE_OF_ARRAY(m_szTaskUserName)); return S_OK;
} else if (ERROR_TRIGGER_CORRUPTED == hr) { return hr; } }
bstrTemp = SysAllocString(FPR_RUN_AS_USER); VariantInit(&vVariant); hr = m_pOutInst->Get(bstrTemp, 0, &vVariant, 0, 0); SAFE_RELEASE_BSTR(bstrTemp); ON_ERROR_THROW_EXCEPTION(hr);
StringCopy(m_szTaskUserName,vVariant.bstrVal,SIZE_OF_ARRAY(m_szTaskUserName)); hr = VariantClear(&vVariant); ON_ERROR_THROW_EXCEPTION(hr); if( 0 == StringLength(m_szTaskUserName,0)) { StringCopy(m_szTaskUserName,GetResString(IDS_ID_NA),SIZE_OF_ARRAY(m_szTaskUserName)); } DEBUG_INFO; return S_OK; }
BOOL CETQuery::GetNValidateTriggerId( IN OUT DWORD *dwLower, IN OUT DWORD *dwUpper ) /*++
Routine Description: Get and validate TriggerId Arguments:
[in/out] dwLower : Trigger id Lower bound. [in/out] dwUpper : Trigger id Upper bound.
Return Value: BOOL
--*/ { // temp variables
CHString szTempId = m_pszTriggerID; CHString szLowerBound = L""; CHString szUpperBound = L""; LPTSTR pszStopString = NULL; BOOL bReturn = TRUE;
DEBUG_INFO;
// Find whether it is a range
DWORD dwIndex = szTempId.Find( '-' );
// check if it is a range
if( -1 == dwIndex) { // Check for numeric
bReturn = IsNumeric( szTempId, 10, FALSE ); if( FALSE == bReturn) { SetReason( GetResString(IDS_INVALID_ID) ); return FALSE; }
// set the upper bound and lower bound to given value
*dwLower = wcstol( szTempId, &pszStopString, 10 ); *dwUpper = wcstol( szTempId, &pszStopString, 10 ); } // if it is a range
else { // get and set the upper bound and lower bound
DWORD dwLength = szTempId.GetLength(); szLowerBound = szTempId.Left( dwIndex ); szLowerBound.TrimLeft(); szLowerBound.TrimRight(); if( ( szLowerBound.GetLength() < 0 ) || ( FALSE == IsNumeric( szLowerBound, 10, FALSE ))) { SetReason( GetResString(IDS_INVALID_RANGE) ); return FALSE; }
szUpperBound = szTempId.Right( dwLength - ( dwIndex + 1) ); szUpperBound.TrimLeft(); szUpperBound.TrimRight(); if( ( szUpperBound.GetLength() < 0 ) || ( FALSE == IsNumeric( szUpperBound, 10, FALSE ))) { SetReason( GetResString(IDS_INVALID_RANGE) ); return FALSE; } *dwLower = wcstol( szLowerBound, &pszStopString, 10 ); *dwUpper = wcstol( szUpperBound, &pszStopString, 10 ); if ( *dwLower >= *dwUpper ) { return FALSE; } } DEBUG_INFO; return TRUE; }
BOOL CETQuery::IsSchSvrcRunning() /*++
Routine Description: This function returns whether schedule task services are started or not. Arguments:
[in/out] dwLower : Trigger id Lower bound. [in/out] dwUpper : Trigger id Upper bound.
Return Value: BOOL: TRUE - Service is started. FALSE- otherwise
--*/ { HRESULT hr = S_OK; IEnumWbemClassObject *pEnum = NULL; ULONG uReturned = 0; VARIANT vVariant; DEBUG_INFO; BOOL bRetValue = FALSE; hr = m_pWbemServices->ExecQuery(_bstr_t(QUERY_LANGUAGE), _bstr_t(QUERY_SCHEDULER_STATUS), WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnum); ON_ERROR_THROW_EXCEPTION(hr); DEBUG_INFO; hr = SetInterfaceSecurity( pEnum, m_pAuthIdentity ); if(FAILED(hr)) { WMISaveError(hr); SAFE_RELEASE_INTERFACE(pEnum); _com_issue_error(hr); }
DEBUG_INFO; pEnum->Next(WBEM_INFINITE,1,&m_pObj,&uReturned);
if(FAILED(hr)) { WMISaveError(hr); SAFE_RELEASE_INTERFACE(pEnum); _com_issue_error(hr); }
DEBUG_INFO; if( 0 == uReturned) { DEBUG_INFO; SAFE_RELEASE_INTERFACE(m_pObj); SAFE_RELEASE_INTERFACE(pEnum); return FALSE; } DEBUG_INFO; VariantInit(&vVariant); hr = m_pObj->Get(_bstr_t(STATUS_PROPERTY),0, &vVariant, 0, 0); SAFE_RELEASE_INTERFACE(m_pObj); SAFE_RELEASE_INTERFACE(pEnum); ON_ERROR_THROW_EXCEPTION(hr); if(VARIANT_TRUE == vVariant.boolVal) { DEBUG_INFO; bRetValue = TRUE; } DEBUG_INFO; VariantClear(&vVariant); return bRetValue; }
/******************************************************************************
Routine Description:
This function sets the ITaskScheduler Interface.It also connects to the remote machine if specified & helps to operate ITaskScheduler on the specified target m/c.
Arguments: none
Return Value : BOOL TRUE: If it successfully sets ITaskScheduler Interface FALSE: Otherwise.
******************************************************************************/
BOOL CETQuery::SetTaskScheduler() { HRESULT hr = S_OK; LPWSTR wszComputerName = NULL; WCHAR wszActualComputerName[ 2 * MAX_STRING_LENGTH ] = DOMAIN_U_STRING; wchar_t* pwsz = L""; WORD wSlashCount = 0 ;
DEBUG_INFO; hr = CoCreateInstance( CLSID_CTaskScheduler, NULL, CLSCTX_ALL, IID_ITaskScheduler,(LPVOID*) &m_pITaskScheduler);
DEBUG_INFO; if( FAILED(hr)) { DEBUG_INFO; SetLastError ((DWORD) hr); ShowLastErrorEx ( stderr, SLE_TYPE_ERROR | SLE_SYSTEM ); return FALSE; } DEBUG_INFO;
//If the operation is on remote machine
if( m_bLocalSystem == FALSE ) { DEBUG_INFO; wszComputerName = (LPWSTR)m_pszServerName;
//check whether the server name prefixed with \\ or not.
if( wszComputerName != NULL ) { pwsz = wszComputerName; while ( ( *pwsz != NULL_U_CHAR ) && ( *pwsz == BACK_SLASH_U ) ) { // server name prefixed with '\'..
// so..increment the pointer and count number of black slashes..
pwsz = _wcsinc(pwsz); wSlashCount++; }
if( (wSlashCount == 2 ) ) // two back slashes are present
{ StringCopy( wszActualComputerName, wszComputerName, SIZE_OF_ARRAY(wszActualComputerName) ); } else if ( wSlashCount == 0 ) { //Append "\\" to computer name
StringConcat(wszActualComputerName, wszComputerName, 2 * MAX_RES_STRING); }
}
hr = m_pITaskScheduler->SetTargetComputer( wszActualComputerName );
} else { DEBUG_INFO; //Local Machine
hr = m_pITaskScheduler->SetTargetComputer( NULL ); }
if( FAILED( hr ) ) { SetLastError ((DWORD) hr); ShowLastErrorEx ( stderr, SLE_TYPE_ERROR | SLE_SYSTEM ); return FALSE; } DEBUG_INFO; return TRUE; }
/******************************************************************************
Routine Description:
This function returns the path of the scheduled task application
Arguments: none Return Value:
A HRESULT value indicating S_OK on success else S_FALSE on failure
******************************************************************************/
HRESULT CETQuery::GetApplicationToRun( void) { ITask *pITask = NULL; LPWSTR lpwszApplicationName = NULL; LPWSTR lpwszParameters = NULL; WCHAR szAppName[MAX_STRING_LENGTH] = L"\0"; WCHAR szParams[MAX_STRING_LENGTH] = L"\0"; HRESULT hr = S_OK;
hr = m_pITaskScheduler->Activate(m_szScheduleTaskName, IID_ITask, (IUnknown**) &pITask);
if (FAILED(hr)) { SAFE_RELEASE_INTERFACE(pITask); return hr; }
// get the entire path of application name
hr = pITask->GetApplicationName(&lpwszApplicationName); if (FAILED(hr)) { CoTaskMemFree(lpwszApplicationName); SAFE_RELEASE_INTERFACE(pITask); return hr; }
// get the parameters
hr = pITask->GetParameters(&lpwszParameters); SAFE_RELEASE_INTERFACE(pITask); if (FAILED(hr)) { CoTaskMemFree(lpwszApplicationName); CoTaskMemFree(lpwszParameters); return hr; } StringCopy( szAppName, lpwszApplicationName, SIZE_OF_ARRAY(szAppName)); StringCopy(szParams, lpwszParameters, SIZE_OF_ARRAY(szParams));
if(StringLength(szAppName, 0) == 0) { StringCopy(m_szTask, L"\0", MAX_STRING_LENGTH); } else { StringConcat( szAppName, _T(" "), SIZE_OF_ARRAY(szAppName) ); StringConcat( szAppName, szParams, SIZE_OF_ARRAY(szAppName) ); StringCopy( m_szTask, szAppName, MAX_STRING_LENGTH); }
CoTaskMemFree(lpwszApplicationName); CoTaskMemFree(lpwszParameters); return S_OK; }
BOOL CETQuery::DisplayXPResults( void ) /*++
Routine Description: This function displays all the triggers present on a remote XP machine. This function is for compatibility of .NET ot XP machine only.
Arguments:
NONE
Return Value: BOOL: TRUE - If succedded in displaying results. FALSE- otherwise
--*/ { HRESULT hr = S_OK; VARIANT vVariant; BOOL bAlwaysTrue = TRUE; DWORD dwEventId = 0; LONG lTemp = 0; DWORD dwFormatType = SR_FORMAT_TABLE;
// store Row number.
DWORD dwRowCount = 0; BOOL bAtLeastOneEvent = FALSE;
BSTR bstrConsumer = NULL; BSTR bstrFilter = NULL;
TCHAR szHostName[MAX_STRING_LENGTH+1]; TCHAR szEventTriggerName[MAX_TRIGGER_NAME];
IEnumWbemClassObject *pEnumCmdTriggerConsumer = NULL; IEnumWbemClassObject *pEnumFilterToConsumerBinding = NULL;
VariantInit( &vVariant );
try { // if -id switch is specified
if( (1 == cmdOptions[ ID_Q_TRIGGERID ].dwActuals) && (StringLength( m_pszTriggerID,0) > 0 )) {
TCHAR szTemp[ MAX_STRING_LENGTH ]; SecureZeroMemory(szTemp, MAX_STRING_LENGTH); StringCchPrintfW( szTemp,SIZE_OF_ARRAY(szTemp), QUERY_RANGE, m_dwLowerBound, m_dwUpperBound ); DEBUG_INFO; hr = m_pWbemServices->ExecQuery( _bstr_t( QUERY_LANGUAGE), _bstr_t(szTemp), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumCmdTriggerConsumer ); ON_ERROR_THROW_EXCEPTION(hr);
DEBUG_INFO; hr = SetInterfaceSecurity( pEnumCmdTriggerConsumer, m_pAuthIdentity ); ON_ERROR_THROW_EXCEPTION(hr);
DEBUG_INFO;
// retrieves CmdTriggerConsumer class
DEBUG_INFO; hr = m_pWbemServices->GetObject(_bstr_t( CLS_TRIGGER_EVENT_CONSUMER ), 0, NULL, &m_pClass, NULL); ON_ERROR_THROW_EXCEPTION(hr);
DEBUG_INFO;
// Gets information about the "QueryETrigger( " method of
// "cmdTriggerConsumer" class
hr = m_pClass->GetMethod(_bstr_t( FN_QUERY_ETRIGGER_XP ), 0, &m_pInClass, NULL); ON_ERROR_THROW_EXCEPTION(hr);
DEBUG_INFO;
// create a new instance of a class "TriggerEventConsumer ".
hr = m_pInClass->SpawnInstance(0, &m_pInInst); ON_ERROR_THROW_EXCEPTION(hr);
hr = SetInterfaceSecurity( pEnumCmdTriggerConsumer, m_pAuthIdentity ); ON_ERROR_THROW_EXCEPTION(hr);
DEBUG_INFO; while( bAlwaysTrue ) { ULONG uReturned = 0; BSTR bstrTemp = NULL; CHString strTemp;
DEBUG_INFO; // Get one object starting at the current position in an
//enumeration
SAFE_RELEASE_INTERFACE(m_pObj); hr = pEnumCmdTriggerConsumer->Next(WBEM_INFINITE, 1,&m_pObj,&uReturned); ON_ERROR_THROW_EXCEPTION(hr); DEBUG_INFO; if( 0 == uReturned) { SAFE_RELEASE_INTERFACE(m_pObj); break; }
hr = m_pObj->Get(_bstr_t( FPR_TRIGGER_ID ), 0, &vVariant, 0, 0); if(FAILED(hr)) { SAFE_RELEASE_INTERFACE(m_pObj); if( WBEM_E_NOT_FOUND == hr) { continue; } ON_ERROR_THROW_EXCEPTION(hr); } DEBUG_INFO; if( ( VT_EMPTY != V_VT( &vVariant ) ) && ( VT_NULL != V_VT( &vVariant ) ) ) { dwEventId = ( DWORD ) vVariant.lVal ; } else { dwEventId = 0 ; } VariantClear(&vVariant);
// Retrieves the "Trigger Name" information
hr = m_pObj->Get(_bstr_t( FPR_TRIGGER_NAME ), 0, &vVariant, 0, 0); ON_ERROR_THROW_EXCEPTION(hr);
if( VT_BSTR == V_VT( &vVariant ) ) { StringCopy(szEventTriggerName, ( LPTSTR )_bstr_t( vVariant ), MAX_RES_STRING); } else { StringCopy(szEventTriggerName, GetResString( IDS_ID_NA ), MAX_RES_STRING); } VariantClear(&vVariant);
// Retrieves the "Trigger Description" information
hr = m_pObj->Get(_bstr_t( FPR_TRIGGER_DESC ), 0, &vVariant, 0, 0); ON_ERROR_THROW_EXCEPTION(hr);
if( VT_BSTR == V_VT( &vVariant ) ) { StringCopy(m_szBuffer,( LPTSTR )_bstr_t( vVariant ), SIZE_OF_ARRAY(m_szBuffer)); } else { StringCopy(m_szBuffer, GetResString( IDS_ID_NA ), SIZE_OF_ARRAY(m_szBuffer)); } lTemp = StringLength(m_szBuffer,0); DEBUG_INFO;
StringCopy(m_szEventDesc,m_szBuffer, SIZE_OF_ARRAY(m_szEventDesc)); VariantClear(&vVariant); DEBUG_INFO;
// Retrieves the "Host Name" information
hr = m_pObj->Get(_bstr_t( L"__SERVER" ), 0, &vVariant, 0, 0); ON_ERROR_THROW_EXCEPTION(hr);
if( VT_BSTR == V_VT( &vVariant ) ) { StringCopy(szHostName,( LPTSTR )_bstr_t( vVariant ),SIZE_OF_ARRAY(szHostName)); } else { StringCopy(szHostName, GetResString( IDS_ID_NA ), SIZE_OF_ARRAY(szHostName)); } VariantClear(&vVariant); DEBUG_INFO;
// Retrieves the "RunAs User" information
hr = m_pObj->Get(_bstr_t( FPR_TASK_SCHEDULER ), 0, &vVariant, 0, 0); ON_ERROR_THROW_EXCEPTION(hr); DEBUG_INFO;
GetRunAsUserName((LPCWSTR)_bstr_t(vVariant.bstrVal), TRUE);
StringCopy(m_szScheduleTaskName,(LPCWSTR)_bstr_t(vVariant), SIZE_OF_ARRAY(m_szScheduleTaskName)); VariantClear(&vVariant);
//retrieves the 'Action' value if exits
hr = m_pObj->Get( _bstr_t( L"Action" ), 0, &vVariant, 0, 0); ON_ERROR_THROW_EXCEPTION(hr);
StringCopy(m_szBuffer,(LPWSTR)_bstr_t(vVariant), SIZE_OF_ARRAY(m_szBuffer));
lTemp = StringLength(m_szBuffer,0);
StringCopy(m_szTask, m_szBuffer, SIZE_OF_ARRAY(m_szTask)); VariantClear(&vVariant);
StringCopy(szTemp,L"",SIZE_OF_ARRAY(szTemp)); StringCchPrintfW( szTemp, SIZE_OF_ARRAY(szTemp), BINDING_CLASS_QUERY, dwEventId);
DEBUG_INFO; hr = m_pWbemServices->ExecQuery( _bstr_t(QUERY_LANGUAGE), _bstr_t(szTemp), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumFilterToConsumerBinding); ON_ERROR_THROW_EXCEPTION(hr);
DEBUG_INFO; hr = SetInterfaceSecurity( pEnumFilterToConsumerBinding, m_pAuthIdentity );
ON_ERROR_THROW_EXCEPTION(hr); DEBUG_INFO;
// Get one object starting at the current position in an
//enumeration
SAFE_RELEASE_INTERFACE(m_pClass); hr = pEnumFilterToConsumerBinding->Next(WBEM_INFINITE, 1,&m_pClass,&uReturned); ON_ERROR_THROW_EXCEPTION(hr); DEBUG_INFO; if( 0 == uReturned ) { SAFE_RELEASE_INTERFACE(pEnumFilterToConsumerBinding); SAFE_RELEASE_INTERFACE(m_pObj); SAFE_RELEASE_INTERFACE(m_pTriggerEventConsumer); SAFE_RELEASE_INTERFACE(m_pEventFilter); continue; }
DEBUG_INFO; hr = m_pClass->Get(_bstr_t( L"Filter" ), 0, &vVariant, 0, 0); ON_ERROR_THROW_EXCEPTION(hr); DEBUG_INFO; hr = m_pWbemServices->GetObject( _bstr_t( vVariant ), 0, NULL, &m_pEventFilter, NULL); VariantClear(&vVariant); DEBUG_INFO; if(FAILED(hr)) { if( WBEM_E_NOT_FOUND == hr) { SAFE_RELEASE_INTERFACE(pEnumFilterToConsumerBinding); continue; } ON_ERROR_THROW_EXCEPTION(hr); }
DEBUG_INFO; hr = m_pEventFilter->Get(_bstr_t( L"Query" ), 0, &vVariant, 0, 0); ON_ERROR_THROW_EXCEPTION(hr);
StringCopy(m_szBuffer,(LPWSTR)_bstr_t(vVariant), SIZE_OF_ARRAY(m_szBuffer)); VariantClear(&vVariant);
DEBUG_INFO;
FindAndReplace(m_szBuffer,QUERY_STRING_AND,SHOW_WQL_QUERY); FindAndReplace(m_szBuffer,L"targetinstance.LogFile",L"Log"); FindAndReplace(m_szBuffer,L"targetinstance.Type",L"Type"); FindAndReplace(m_szBuffer,L"targetinstance.EventCode",L"Id"); FindAndReplace(m_szBuffer, L"targetinstance.SourceName",L"Source");
DEBUG_INFO; // Remove extra spaces
FindAndReplace( m_szBuffer,L" ",L" ");
// Remove extra spaces
FindAndReplace(m_szBuffer,L" ",L" ");
lTemp = StringLength(m_szBuffer,0);
// for the safer size for allocation of memory.
// allocates memory only if new WQL is greate than previous one.
lTemp += 4;
if(lTemp > m_lWQLColWidth) { DEBUG_INFO; // first free it (if previously allocated)
RELEASE_MEMORY_EX(m_pszEventQuery); m_pszEventQuery = new TCHAR[lTemp+1]; CheckAndSetMemoryAllocation(m_pszEventQuery,lTemp); } lTemp = m_lWQLColWidth; CalcColWidth(lTemp,&m_lWQLColWidth,m_szBuffer);
// Now manipulate the WQL string to get EventQuery....
FindAndReplace(m_szBuffer,SHOW_WQL_QUERY, GetResString(IDS_EVENTS_WITH));
//to remove extra spaces
FindAndReplace(m_szBuffer,L" ",L" ");
//to remove extra spaces
FindAndReplace( m_szBuffer,L" ",L" "); StringCopy( m_pszEventQuery,m_szBuffer, SIZE_OF_NEW_ARRAY(m_pszEventQuery));
DEBUG_INFO;
// Now Shows the results on screen
// Appends for in m_arrColData array
dwRowCount = DynArrayAppendRow( m_arrColData, NO_OF_COLUMNS );
// Fills Results in m_arrColData data structure
DynArraySetString2( m_arrColData, dwRowCount, HOST_NAME, szHostName,0); DynArraySetDWORD2( m_arrColData , dwRowCount, TRIGGER_ID,dwEventId); DynArraySetString2( m_arrColData, dwRowCount, TRIGGER_NAME, szEventTriggerName,0); DynArraySetString2( m_arrColData, dwRowCount, TASK, m_szTask,0); DynArraySetString2( m_arrColData, dwRowCount, EVENT_QUERY, m_pszEventQuery,0); DynArraySetString2( m_arrColData, dwRowCount, EVENT_DESCRIPTION, m_szEventDesc,0); DynArraySetString2( m_arrColData, dwRowCount, TASK_USERNAME, m_szTaskUserName,0);
bAtLeastOneEvent = TRUE;
// Calculatate new column width for each column
lTemp = m_lHostNameColWidth; CalcColWidth(lTemp,&m_lHostNameColWidth,szHostName);
lTemp = m_lETNameColWidth; CalcColWidth(lTemp,&m_lETNameColWidth,szEventTriggerName);
lTemp = m_lTaskColWidth; CalcColWidth(lTemp,&m_lTaskColWidth,m_szTask);
lTemp = m_lQueryColWidth; CalcColWidth(lTemp,&m_lQueryColWidth,m_pszEventQuery);
lTemp = m_lDescriptionColWidth; CalcColWidth(lTemp,&m_lDescriptionColWidth,m_szEventDesc);
// Resets current containts..if any
StringCopy(szHostName, L"",SIZE_OF_ARRAY(szHostName)); dwEventId = 0; StringCopy(szEventTriggerName,L"",SIZE_OF_ARRAY(szEventTriggerName)); StringCopy( m_szTask, L"", SIZE_OF_ARRAY(m_szTask)); StringCopy(m_pszEventQuery,L"",SIZE_OF_NEW_ARRAY(m_pszEventQuery)); StringCopy(m_szEventDesc,L"",SIZE_OF_ARRAY(m_szEventDesc)); SAFE_RELEASE_INTERFACE(m_pObj); SAFE_RELEASE_INTERFACE(m_pTriggerEventConsumer); SAFE_RELEASE_INTERFACE(m_pEventFilter);
DEBUG_INFO; } } else { //Following method will creates an enumerator that returns the
// instances of a specified __FilterToConsumerBinding class
hr = m_pWbemServices-> CreateInstanceEnum(_bstr_t( CLS_FILTER_TO_CONSUMERBINDING ), WBEM_FLAG_SHALLOW, NULL, &pEnumFilterToConsumerBinding); ON_ERROR_THROW_EXCEPTION(hr);
hr = SetInterfaceSecurity( pEnumFilterToConsumerBinding, m_pAuthIdentity ); ON_ERROR_THROW_EXCEPTION(hr);
// retrieves CmdTriggerConsumer class
hr = m_pWbemServices->GetObject(_bstr_t( CLS_TRIGGER_EVENT_CONSUMER ), 0, NULL, &m_pClass, NULL); ON_ERROR_THROW_EXCEPTION(hr);
// Gets information about the "QueryETrigger( " method of
// "cmdTriggerConsumer" class
hr = m_pClass->GetMethod(_bstr_t( FN_QUERY_ETRIGGER_XP ), 0, &m_pInClass, NULL); ON_ERROR_THROW_EXCEPTION(hr);
// create a new instance of a class "TriggerEventConsumer ".
hr = m_pInClass->SpawnInstance(0, &m_pInInst); ON_ERROR_THROW_EXCEPTION(hr);
// set the security at the interface level also
hr = SetInterfaceSecurity( pEnumFilterToConsumerBinding, m_pAuthIdentity ); ON_ERROR_THROW_EXCEPTION(hr);
while(1) { ULONG uReturned = 0; // holds no. of object returns from Next
//mathod
BSTR bstrTemp = NULL; CHString strTemp;
// Get one object starting at the current position in an
//enumeration
hr = pEnumFilterToConsumerBinding->Next(WBEM_INFINITE, 1,&m_pObj,&uReturned); ON_ERROR_THROW_EXCEPTION(hr); if(uReturned == 0) { SAFE_RELEASE_INTERFACE(m_pObj); break; } VariantInit(&vVariant); SAFE_RELEASE_BSTR(bstrTemp); hr = m_pObj->Get(_bstr_t( L"Consumer" ), 0, &vVariant, 0, 0); ON_ERROR_THROW_EXCEPTION(hr);
bstrConsumer =SysAllocString( vVariant.bstrVal); hr = VariantClear(&vVariant); ON_ERROR_THROW_EXCEPTION(hr); // Search for trggereventconsumer string as we are interested to
// get object from this class only
strTemp = bstrConsumer; if(strTemp.Find(CLS_TRIGGER_EVENT_CONSUMER)==-1) continue; hr = SetInterfaceSecurity( m_pWbemServices, m_pAuthIdentity );
ON_ERROR_THROW_EXCEPTION(hr);
hr = m_pWbemServices->GetObject(bstrConsumer, 0, NULL, &m_pTriggerEventConsumer, NULL); SAFE_RELEASE_BSTR(bstrConsumer); if(FAILED(hr)) { if(hr==WBEM_E_NOT_FOUND) continue; ON_ERROR_THROW_EXCEPTION(hr); } bstrTemp = SysAllocString(L"Filter"); hr = m_pObj->Get(bstrTemp, 0, &vVariant, 0, 0); SAFE_RELEASE_BSTR(bstrTemp); ON_ERROR_THROW_EXCEPTION(hr); bstrFilter = SysAllocString(vVariant.bstrVal); hr = VariantClear(&vVariant); ON_ERROR_THROW_EXCEPTION(hr); hr = m_pWbemServices->GetObject( bstrFilter, 0, NULL, &m_pEventFilter, NULL); SAFE_RELEASE_BSTR(bstrFilter); if(FAILED(hr)) { if(hr==WBEM_E_NOT_FOUND) continue; ON_ERROR_THROW_EXCEPTION(hr); }
//retrieves the 'TriggerID' value if exits
bstrTemp = SysAllocString(FPR_TRIGGER_ID); hr = m_pTriggerEventConsumer->Get(bstrTemp, 0, &vVariant, 0, 0); if(FAILED(hr)) { if(hr==WBEM_E_NOT_FOUND) continue; ON_ERROR_THROW_EXCEPTION(hr); } SAFE_RELEASE_BSTR(bstrTemp); dwEventId = vVariant.lVal ; hr = VariantClear(&vVariant); ON_ERROR_THROW_EXCEPTION(hr);
//retrieves the 'Action' value if exits
bstrTemp = SysAllocString(L"Action"); hr = m_pTriggerEventConsumer->Get(bstrTemp, 0, &vVariant, 0, 0); ON_ERROR_THROW_EXCEPTION(hr); SAFE_RELEASE_BSTR(bstrTemp);
StringCopy( m_szBuffer, (LPWSTR)_bstr_t(vVariant), SIZE_OF_ARRAY( m_szBuffer )); lTemp = StringLength( m_szBuffer, 0 ); lTemp += 4; // for the safer size for allocation of memory.
// allocates memory only if new task length is greate than previous one.
if(lTemp > m_lTaskColWidth) { CheckAndSetMemoryAllocation(m_szTask,lTemp); } StringCopy(m_szTask,m_szBuffer, SIZE_OF_ARRAY(m_szTask)); VariantClear(&vVariant);
//retrieves the 'TriggerDesc' value if exits
bstrTemp = SysAllocString(FPR_TRIGGER_DESC); hr = m_pTriggerEventConsumer->Get(bstrTemp, 0, &vVariant, 0, 0); ON_ERROR_THROW_EXCEPTION(hr);
SAFE_RELEASE_BSTR(bstrTemp);
StringCopy(m_szBuffer,(_TCHAR*)_bstr_t(vVariant.bstrVal), SIZE_OF_ARRAY( m_szBuffer )); lTemp = StringLength(m_szBuffer, 0); if(lTemp == 0)// Means description is not available make it N/A.
{ StringCopy(m_szBuffer,GetResString(IDS_ID_NA), SIZE_OF_ARRAY( m_szBuffer )); lTemp = StringLength(m_szBuffer, 0); } lTemp += 4; // for the safer size for allocation of memory.
// allocates memory only if new Description length is greate than
// previous one.
if(lTemp > m_lDescriptionColWidth) { CheckAndSetMemoryAllocation(m_szEventDesc,lTemp); } StringCopy(m_szEventDesc,m_szBuffer, SIZE_OF_ARRAY( m_szEventDesc )); hr = VariantClear(&vVariant); ON_ERROR_THROW_EXCEPTION(hr); // TriggerName
//retrieves the 'TriggerName' value if exits
bstrTemp = SysAllocString(FPR_TRIGGER_NAME); hr = m_pTriggerEventConsumer->Get(bstrTemp, 0, &vVariant, 0, 0); SAFE_RELEASE_BSTR(bstrTemp); ON_ERROR_THROW_EXCEPTION(hr); StringCchPrintfW(szEventTriggerName, SIZE_OF_ARRAY(szEventTriggerName), _T("%s"), (LPWSTR)_bstr_t( vVariant )); hr = VariantClear(&vVariant); ON_ERROR_THROW_EXCEPTION(hr);
// Host Name
//retrieves the '__SERVER' value if exits
bstrTemp = SysAllocString(L"__SERVER"); hr = m_pTriggerEventConsumer->Get(bstrTemp, 0, &vVariant, 0, 0); SAFE_RELEASE_BSTR(bstrTemp); ON_ERROR_THROW_EXCEPTION(hr);
StringCchPrintfW(szHostName, SIZE_OF_ARRAY(szHostName), _T("%s"), (LPWSTR)_bstr_t( vVariant )); VariantClear(&vVariant);
// Retrieve 'Query' for the trigger.
hr = m_pEventFilter->Get(_bstr_t( L"Query" ), 0, &vVariant, 0, 0); ON_ERROR_THROW_EXCEPTION(hr);
StringCopy(m_szBuffer,(LPWSTR)_bstr_t(vVariant), SIZE_OF_ARRAY( m_szBuffer )); VariantClear(&vVariant);
FindAndReplace(m_szBuffer,QUERY_STRING_AND,SHOW_WQL_QUERY); FindAndReplace(m_szBuffer,L"targetinstance.LogFile",L"Log"); FindAndReplace(m_szBuffer,L"targetinstance.Type",L"Type"); FindAndReplace(m_szBuffer,L"targetinstance.EventCode",L"Id"); FindAndReplace(m_szBuffer, L"targetinstance.SourceName",L"Source"); FindAndReplace(m_szBuffer,L" ",L" ");//to remove extra spaces
FindAndReplace(m_szBuffer,L" ",L" ");//to remove extra spaces
lTemp = StringLength(m_szBuffer, 0); lTemp += 4; // for the safer size for allocation of memory.
// allocates memory only if new WQL is greate than previous one.
if(lTemp > m_lWQLColWidth) { // first free it (if previously allocated)
RELEASE_MEMORY_EX(m_pszEventQuery); m_pszEventQuery = new TCHAR[lTemp+1]; CheckAndSetMemoryAllocation(m_pszEventQuery,lTemp); }
lTemp = m_lWQLColWidth; CalcColWidth(lTemp,&m_lWQLColWidth,m_szBuffer); // Now manipulate the WQL string to get EventQuery....
FindAndReplace(m_szBuffer,SHOW_WQL_QUERY, GetResString(IDS_EVENTS_WITH)); FindAndReplace(m_szBuffer,L" ",L" ");//to remove extra spaces
FindAndReplace(m_szBuffer,L" ",L" ");//to remove extra spaces
StringCopy(m_pszEventQuery,m_szBuffer, SIZE_OF_NEW_ARRAY( m_pszEventQuery ));
// Retrieves the "TaskScheduler" information
bstrTemp = SysAllocString(L"ScheduledTaskName"); hr = m_pTriggerEventConsumer->Get(bstrTemp, 0, &vVariant, 0, 0); SAFE_RELEASE_BSTR(bstrTemp); ON_ERROR_THROW_EXCEPTION(hr); GetRunAsUserName((LPCWSTR)_bstr_t(vVariant.bstrVal), TRUE); StringCopy( m_szScheduleTaskName, (LPWSTR) _bstr_t( vVariant ), SIZE_OF_ARRAY( m_szScheduleTaskName ) ); VariantClear(&vVariant);
//////////////////////////////////////////
// Now Shows the results on screen
// Appends for in m_arrColData array
dwRowCount = DynArrayAppendRow( m_arrColData, NO_OF_COLUMNS ); // Fills Results in m_arrColData data structure
DynArraySetString2(m_arrColData,dwRowCount,HOST_NAME,szHostName,0); DynArraySetDWORD2(m_arrColData ,dwRowCount,TRIGGER_ID,dwEventId); DynArraySetString2(m_arrColData,dwRowCount,TRIGGER_NAME,szEventTriggerName,0); DynArraySetString2(m_arrColData,dwRowCount,TASK,m_szTask,0); DynArraySetString2(m_arrColData,dwRowCount,EVENT_QUERY,m_pszEventQuery,0); DynArraySetString2(m_arrColData,dwRowCount,EVENT_DESCRIPTION,m_szEventDesc,0); DynArraySetString2(m_arrColData,dwRowCount,TASK_USERNAME,m_szTaskUserName,0); bAtLeastOneEvent = TRUE;
// Calculatate new column width for each column
lTemp = m_lHostNameColWidth; CalcColWidth(lTemp,&m_lHostNameColWidth,szHostName);
lTemp = m_lETNameColWidth; CalcColWidth(lTemp,&m_lETNameColWidth,szEventTriggerName);
lTemp = m_lTaskColWidth; CalcColWidth(lTemp,&m_lTaskColWidth,m_szTask);
lTemp = m_lQueryColWidth; CalcColWidth(lTemp,&m_lQueryColWidth,m_pszEventQuery);
lTemp = m_lDescriptionColWidth; CalcColWidth(lTemp,&m_lDescriptionColWidth,m_szEventDesc); // Resets current containts..if any
StringCopy( szHostName,L"", SIZE_OF_ARRAY(szHostName) ); dwEventId = 0; StringCopy( szEventTriggerName, L"", SIZE_OF_ARRAY(szEventTriggerName)); StringCopy( m_szTask, L"", SIZE_OF_ARRAY(m_szTask)); StringCopy( m_pszEventQuery, L"", SIZE_OF_ARRAY(m_pszEventQuery)); StringCopy( m_szEventDesc, L"", SIZE_OF_ARRAY(m_szEventDesc) ); SAFE_RELEASE_INTERFACE(m_pObj); SAFE_RELEASE_INTERFACE(m_pTriggerEventConsumer); SAFE_RELEASE_INTERFACE(m_pEventFilter); } // End of while
} if(0 == StringCompare( m_pszFormat,GetResString(IDS_STRING_TABLE), TRUE,0)) { dwFormatType = SR_FORMAT_TABLE; } else if(0 == StringCompare( m_pszFormat, GetResString(IDS_STRING_LIST),TRUE,0)) { dwFormatType = SR_FORMAT_LIST; } else if(0 == StringCompare( m_pszFormat, GetResString(IDS_STRING_CSV),TRUE,0)) { dwFormatType = SR_FORMAT_CSV; } else // Default
{ dwFormatType = SR_FORMAT_TABLE; } if( TRUE == bAtLeastOneEvent) { // Show Final Query Results on screen
PrepareColumns (); DEBUG_INFO; if ( FALSE == IsSchSvrcRunning()) { DEBUG_INFO; ShowMessage(stderr,GetResString(IDS_SERVICE_NOT_RUNNING)); } if((SR_FORMAT_CSV & dwFormatType) != SR_FORMAT_CSV) { ShowMessage(stdout,BLANK_LINE); } if( TRUE == m_bNoHeader) { dwFormatType |= SR_NOHEADER; }
ShowResults(NO_OF_COLUMNS,mainCols,dwFormatType,m_arrColData); } else if( StringLength(m_pszTriggerID,0)> 0) { // Show Message
TCHAR szErrorMsg[MAX_RES_STRING+1]; TCHAR szMsgFormat[MAX_RES_STRING+1]; StringCopy(szMsgFormat,GetResString(IDS_NO_EVENTID_FOUND), SIZE_OF_ARRAY(szMsgFormat)); StringCchPrintfW(szErrorMsg, SIZE_OF_ARRAY(szErrorMsg), szMsgFormat,m_pszTriggerID); ShowMessage(stdout,szErrorMsg); } else { // Show Message
ShowMessage(stdout,GetResString(IDS_NO_EVENT_FOUNT)); } } catch( _com_error e ) { DEBUG_INFO;
// WMI returns string for this hr value is "Not Found." which is not
// user friendly. So changing the message text.
if( 0x80041002 == hr ) { ShowMessage( stderr,GetResString(IDS_CLASS_NOT_REG)); } else { DEBUG_INFO; WMISaveError( e ); ShowLastErrorEx(stderr,SLE_TYPE_ERROR|SLE_INTERNAL); } SAFE_RELEASE_INTERFACE( pEnumCmdTriggerConsumer ); SAFE_RELEASE_INTERFACE( pEnumFilterToConsumerBinding ); return FALSE; } catch( CHeap_Exception ) { WMISaveError( WBEM_E_OUT_OF_MEMORY ); ShowLastErrorEx(stderr,SLE_TYPE_ERROR|SLE_INTERNAL); SAFE_RELEASE_INTERFACE( pEnumCmdTriggerConsumer ); SAFE_RELEASE_INTERFACE( pEnumFilterToConsumerBinding ); return FALSE; }
SAFE_RELEASE_INTERFACE( pEnumCmdTriggerConsumer ); SAFE_RELEASE_INTERFACE( pEnumFilterToConsumerBinding ); // Operation successful.
return TRUE; }
|