Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2903 lines
106 KiB

  1. /*****************************************************************************
  2. Copyright (c) Microsoft Corporation
  3. Module Name:
  4. ETQuery.CPP
  5. Abstract:
  6. This module is intended to have the functionality for EVENTTRIGGERS.EXE
  7. with -query parameter.
  8. This will Query WMI and shows presently available Event Triggers.
  9. Author:
  10. Akhil Gokhale 03-Oct.-2000 (Created it)
  11. Revision History:
  12. ******************************************************************************/
  13. #include "pch.h"
  14. #include "ETCommon.h"
  15. #include "resource.h"
  16. #include "ShowError.h"
  17. #include "ETQuery.h"
  18. #include "WMI.h"
  19. #define DEFAULT_USER L"NT AUTHORITY\\SYSTEM"
  20. #define DBL_SLASH L"\\\\";
  21. // Defines local to this file
  22. #define SHOW_WQL_QUERY L"select * from __instancecreationevent where"
  23. #define QUERY_STRING_AND L"select * from __instancecreationevent where \
  24. targetinstance isa \"win32_ntlogevent\" AND"
  25. #define BLANK_LINE L"\n"
  26. #define QUERY_SCHEDULER_STATUS L"select * from Win32_Service where Name=\"Schedule\""
  27. #define STATUS_PROPERTY L"Started"
  28. CETQuery::CETQuery()
  29. /*++
  30. Routine Description:
  31. Class default constructor.
  32. Arguments:
  33. None
  34. Return Value:
  35. None
  36. --*/
  37. {
  38. // init to defaults
  39. m_bNeedDisconnect = FALSE;
  40. m_pszServerName = NULL;
  41. m_pszUserName = NULL;
  42. m_pszPassword = NULL;
  43. m_pszFormat = NULL;
  44. m_pszTriggerID = NULL;
  45. m_bVerbose = FALSE;
  46. m_bNoHeader = FALSE;
  47. m_bNeedPassword = FALSE;
  48. m_bUsage = FALSE;
  49. m_bQuery = FALSE;
  50. m_pWbemLocator = NULL;
  51. m_pWbemServices = NULL;
  52. m_pAuthIdentity = NULL;
  53. m_pObj = NULL;
  54. m_pTriggerEventConsumer = NULL;
  55. m_pEventFilter = NULL;
  56. m_arrColData = NULL;
  57. m_pszEventQuery = NULL;
  58. m_bIsCOMInitialize = FALSE;
  59. m_dwLowerBound = 0;
  60. m_dwUpperBound = 0;
  61. m_pClass = NULL;
  62. m_pInClass = NULL;
  63. m_pInInst = NULL;
  64. m_pOutInst = NULL;
  65. m_pITaskScheduler = NULL;
  66. m_lHostNameColWidth = WIDTH_HOSTNAME;
  67. m_lTriggerIDColWidth = WIDTH_TRIGGER_ID;
  68. m_lETNameColWidth = WIDTH_TRIGGER_NAME;
  69. m_lTaskColWidth = WIDTH_TASK;
  70. m_lQueryColWidth = WIDTH_EVENT_QUERY;
  71. m_lDescriptionColWidth = WIDTH_DESCRIPTION;
  72. m_lWQLColWidth = 0;
  73. m_lTaskUserName = WIDTH_TASK_USERNAME;
  74. }
  75. CETQuery::CETQuery(
  76. LONG lMinMemoryReq,
  77. BOOL bNeedPassword
  78. )
  79. /*++
  80. Routine Description:
  81. Class constructor.
  82. Arguments:
  83. None
  84. Return Value:
  85. None
  86. --*/
  87. {
  88. // init to defaults
  89. m_bNeedDisconnect = FALSE;
  90. m_pszServerName = NULL;
  91. m_pszUserName = NULL;
  92. m_pszPassword = NULL;
  93. m_pszFormat = NULL;
  94. m_pszTriggerID = NULL;
  95. m_bVerbose = FALSE;
  96. m_bNoHeader = FALSE;
  97. m_bIsCOMInitialize = FALSE;
  98. m_bNeedPassword = bNeedPassword;
  99. m_bUsage = FALSE;
  100. m_bQuery = FALSE;
  101. m_lMinMemoryReq = lMinMemoryReq;
  102. m_pClass = NULL;
  103. m_pInClass = NULL;
  104. m_pInInst = NULL;
  105. m_pOutInst = NULL;
  106. m_pWbemLocator = NULL;
  107. m_pWbemServices = NULL;
  108. m_pAuthIdentity = NULL;
  109. m_arrColData = NULL;
  110. m_pObj = NULL;
  111. m_pTriggerEventConsumer = NULL;
  112. m_pEventFilter = NULL;
  113. m_dwLowerBound = 0;
  114. m_dwUpperBound = 0;
  115. m_pITaskScheduler = NULL;
  116. m_pszEventQuery = NULL;
  117. m_lHostNameColWidth = WIDTH_HOSTNAME;
  118. m_lTriggerIDColWidth = WIDTH_TRIGGER_ID;
  119. m_lETNameColWidth = WIDTH_TRIGGER_NAME;
  120. m_lTaskColWidth = WIDTH_TASK;
  121. m_lQueryColWidth = WIDTH_EVENT_QUERY;
  122. m_lDescriptionColWidth = WIDTH_DESCRIPTION;
  123. m_lWQLColWidth = 0;
  124. m_lTaskUserName = WIDTH_TASK_USERNAME;
  125. }
  126. CETQuery::~CETQuery()
  127. /*++
  128. Routine Description:
  129. Class desctructor. It frees memory which is allocated during instance
  130. creation.
  131. Arguments:
  132. None
  133. Return Value:
  134. None
  135. --*/
  136. {
  137. DEBUG_INFO;
  138. FreeMemory((LPVOID*)& m_pszUserName);
  139. FreeMemory((LPVOID*)& m_pszPassword);
  140. FreeMemory((LPVOID*)& m_pszFormat);
  141. FreeMemory((LPVOID*)& m_pszTriggerID);
  142. DESTROY_ARRAY(m_arrColData);
  143. SAFE_RELEASE_INTERFACE(m_pWbemLocator);
  144. SAFE_RELEASE_INTERFACE(m_pWbemServices);
  145. SAFE_RELEASE_INTERFACE(m_pObj);
  146. SAFE_RELEASE_INTERFACE(m_pTriggerEventConsumer);
  147. SAFE_RELEASE_INTERFACE(m_pEventFilter);
  148. SAFE_RELEASE_INTERFACE(m_pClass);
  149. SAFE_RELEASE_INTERFACE(m_pInClass);
  150. SAFE_RELEASE_INTERFACE(m_pInInst);
  151. SAFE_RELEASE_INTERFACE(m_pOutInst);
  152. SAFE_RELEASE_INTERFACE(m_pITaskScheduler);
  153. // Release Authority
  154. WbemFreeAuthIdentity(&m_pAuthIdentity);
  155. RELEASE_MEMORY_EX(m_pszEventQuery);
  156. // Close the remote connection if any.
  157. if (FALSE == m_bLocalSystem)
  158. {
  159. CloseConnection(m_pszServerName);
  160. }
  161. FreeMemory((LPVOID*)& m_pszServerName);
  162. // Uninitialize COM only when it is initialized.
  163. if( TRUE == m_bIsCOMInitialize )
  164. {
  165. CoUninitialize();
  166. }
  167. DEBUG_INFO;
  168. }
  169. void
  170. CETQuery::PrepareCMDStruct()
  171. /*++
  172. Routine Description:
  173. This function will prepare column structure for DoParseParam Function.
  174. Arguments:
  175. none
  176. Return Value:
  177. none
  178. --*/
  179. {
  180. DEBUG_INFO;
  181. // -query
  182. StringCopyA( cmdOptions[ ID_Q_QUERY ].szSignature, "PARSER2\0", 8 );
  183. cmdOptions[ ID_Q_QUERY ].dwType = CP_TYPE_BOOLEAN;
  184. cmdOptions[ ID_Q_QUERY ].pwszOptions = szQueryOption;
  185. cmdOptions[ ID_Q_QUERY ].dwCount = 1;
  186. cmdOptions[ ID_Q_QUERY ].dwActuals = 0;
  187. cmdOptions[ ID_Q_QUERY ].dwFlags = 0;
  188. cmdOptions[ ID_Q_QUERY ].pValue = &m_bQuery;
  189. cmdOptions[ ID_Q_QUERY ].dwLength = 0;
  190. // -s (servername)
  191. StringCopyA( cmdOptions[ ID_Q_SERVER ].szSignature, "PARSER2\0", 8 );
  192. cmdOptions[ ID_Q_SERVER ].dwType = CP_TYPE_TEXT;
  193. cmdOptions[ ID_Q_SERVER ].pwszOptions = szServerNameOption;
  194. cmdOptions[ ID_Q_SERVER ].dwCount = 1;
  195. cmdOptions[ ID_Q_SERVER ].dwActuals = 0;
  196. cmdOptions[ ID_Q_SERVER ].dwFlags = CP2_ALLOCMEMORY|CP2_VALUE_TRIMINPUT|CP2_VALUE_NONULL;
  197. cmdOptions[ ID_Q_SERVER ].pValue = NULL; //m_pszServerName
  198. cmdOptions[ ID_Q_SERVER ].dwLength = 0;
  199. // -u (username)
  200. StringCopyA( cmdOptions[ ID_Q_USERNAME ].szSignature, "PARSER2\0", 8 );
  201. cmdOptions[ ID_Q_USERNAME ].dwType = CP_TYPE_TEXT;
  202. cmdOptions[ ID_Q_USERNAME ].pwszOptions = szUserNameOption;
  203. cmdOptions[ ID_Q_USERNAME ].dwCount = 1;
  204. cmdOptions[ ID_Q_USERNAME ].dwActuals = 0;
  205. cmdOptions[ ID_Q_USERNAME ].dwFlags = CP2_ALLOCMEMORY|CP2_VALUE_TRIMINPUT|CP2_VALUE_NONULL;
  206. cmdOptions[ ID_Q_USERNAME ].pValue = NULL; //m_pszUserName
  207. cmdOptions[ ID_Q_USERNAME ].dwLength = 0;
  208. // -p (password)
  209. StringCopyA( cmdOptions[ ID_Q_PASSWORD ].szSignature, "PARSER2\0", 8 );
  210. cmdOptions[ ID_Q_PASSWORD ].dwType = CP_TYPE_TEXT;
  211. cmdOptions[ ID_Q_PASSWORD ].pwszOptions = szPasswordOption;
  212. cmdOptions[ ID_Q_PASSWORD ].dwCount = 1;
  213. cmdOptions[ ID_Q_PASSWORD ].dwActuals = 0;
  214. cmdOptions[ ID_Q_PASSWORD ].dwFlags = CP2_ALLOCMEMORY | CP2_VALUE_OPTIONAL;
  215. cmdOptions[ ID_Q_PASSWORD ].pValue = NULL; //m_pszPassword
  216. cmdOptions[ ID_Q_PASSWORD ].dwLength = 0;
  217. // -fo
  218. StringCopyA( cmdOptions[ ID_Q_FORMAT ].szSignature, "PARSER2\0", 8 );
  219. cmdOptions[ ID_Q_FORMAT ].dwType = CP_TYPE_TEXT;
  220. cmdOptions[ ID_Q_FORMAT ].pwszOptions = szFormatOption;
  221. cmdOptions[ ID_Q_FORMAT ].pwszValues = GetResString(IDS_FORMAT_OPTIONS);
  222. cmdOptions[ ID_Q_FORMAT ].dwCount = 1;
  223. cmdOptions[ ID_Q_FORMAT ].dwActuals = 0;
  224. cmdOptions[ ID_Q_FORMAT ].dwFlags = CP2_MODE_VALUES | CP2_VALUE_TRIMINPUT|
  225. CP2_VALUE_NONULL | CP2_ALLOCMEMORY;
  226. cmdOptions[ ID_Q_FORMAT ].pValue = NULL;
  227. cmdOptions[ ID_Q_FORMAT ].dwLength = MAX_STRING_LENGTH;
  228. // -nh
  229. StringCopyA( cmdOptions[ ID_Q_NOHEADER ].szSignature, "PARSER2\0", 8 );
  230. cmdOptions[ ID_Q_NOHEADER ].dwType = CP_TYPE_BOOLEAN;
  231. cmdOptions[ ID_Q_NOHEADER ].pwszOptions = szNoHeaderOption;
  232. cmdOptions[ ID_Q_NOHEADER ].pwszValues = NULL;
  233. cmdOptions[ ID_Q_NOHEADER ].dwCount = 1;
  234. cmdOptions[ ID_Q_NOHEADER ].dwActuals = 0;
  235. cmdOptions[ ID_Q_NOHEADER ].dwFlags = 0;
  236. cmdOptions[ ID_Q_NOHEADER ].pValue = &m_bNoHeader;
  237. // -v verbose
  238. StringCopyA( cmdOptions[ ID_Q_VERBOSE ].szSignature, "PARSER2\0", 8 );
  239. cmdOptions[ ID_Q_VERBOSE ].dwType = CP_TYPE_BOOLEAN;
  240. cmdOptions[ ID_Q_VERBOSE ].pwszOptions = szVerboseOption;
  241. cmdOptions[ ID_Q_VERBOSE ].pwszValues = NULL;
  242. cmdOptions[ ID_Q_VERBOSE ].dwCount = 1;
  243. cmdOptions[ ID_Q_VERBOSE ].dwActuals = 0;
  244. cmdOptions[ ID_Q_VERBOSE ].dwFlags = 0;
  245. cmdOptions[ ID_Q_VERBOSE ].pValue = &m_bVerbose;
  246. cmdOptions[ ID_Q_VERBOSE ].dwLength = 0;
  247. // -id
  248. StringCopyA( cmdOptions[ ID_Q_TRIGGERID ].szSignature, "PARSER2\0", 8 );
  249. cmdOptions[ ID_Q_TRIGGERID ].dwType = CP_TYPE_TEXT;
  250. cmdOptions[ ID_Q_TRIGGERID ].pwszOptions = szTriggerIDOption;
  251. cmdOptions[ ID_Q_TRIGGERID ].pwszValues = NULL;
  252. cmdOptions[ ID_Q_TRIGGERID ].dwCount = 1;
  253. cmdOptions[ ID_Q_TRIGGERID ].dwActuals = 0;
  254. cmdOptions[ ID_Q_TRIGGERID ].dwFlags = CP2_ALLOCMEMORY|CP2_VALUE_TRIMINPUT|CP2_VALUE_NONULL;
  255. cmdOptions[ ID_Q_TRIGGERID ].pValue = NULL;
  256. DEBUG_INFO;
  257. }
  258. void
  259. CETQuery::ProcessOption(
  260. IN DWORD argc,
  261. IN LPCTSTR argv[])
  262. /*++
  263. Routine Description:
  264. This function will process/parce the command line options.
  265. Arguments:
  266. [ in ] argc : argument(s) count specified at the command prompt
  267. [ in ] argv : argument(s) specified at the command prompt
  268. Return Value:
  269. TRUE : On Successful
  270. FALSE : On Error
  271. --*/
  272. {
  273. // local variable
  274. BOOL bReturn = TRUE;
  275. CHString szTempString;
  276. DEBUG_INFO;
  277. PrepareCMDStruct ();
  278. // do the actual parsing of the command line arguments and check the result
  279. bReturn = DoParseParam2( argc, argv, ID_Q_QUERY,
  280. MAX_COMMANDLINE_Q_OPTION, cmdOptions ,0);
  281. // Take values from 'cmdOptions' structure
  282. m_pszServerName = (LPWSTR)cmdOptions[ ID_Q_SERVER ].pValue;
  283. m_pszUserName = (LPWSTR)cmdOptions[ ID_Q_USERNAME ].pValue;
  284. m_pszPassword = (LPWSTR)cmdOptions[ ID_Q_PASSWORD ].pValue;
  285. m_pszFormat = (LPWSTR)cmdOptions[ ID_Q_FORMAT ].pValue;
  286. m_pszTriggerID = (LPWSTR)cmdOptions[ ID_Q_TRIGGERID ].pValue;
  287. if( FALSE == bReturn)
  288. {
  289. throw CShowError(MK_E_SYNTAX);
  290. }
  291. DEBUG_INFO;
  292. // "-p" should not be specified without -u
  293. if ( (0 == cmdOptions[ID_Q_USERNAME].dwActuals) &&
  294. (0 != cmdOptions[ID_Q_PASSWORD].dwActuals ))
  295. {
  296. // invalid syntax
  297. throw CShowError(IDS_USERNAME_REQUIRED);
  298. }
  299. DEBUG_INFO;
  300. if( (1 == cmdOptions[ID_Q_TRIGGERID].dwActuals) &&
  301. (FALSE == GetNValidateTriggerId( &m_dwLowerBound, &m_dwUpperBound )))
  302. {
  303. throw CShowError(IDS_INVALID_RANGE);
  304. }
  305. // check the remote connectivity information
  306. if ( m_pszServerName != NULL )
  307. {
  308. //
  309. // if -u is not specified, we need to allocate memory
  310. // in order to be able to retrive the current user name
  311. //
  312. // case 1: -p is not at all specified
  313. // as the value for this switch is optional, we have to rely
  314. // on the dwActuals to determine whether the switch is specified or not
  315. // in this case utility needs to try to connect first and if it fails
  316. // then prompt for the password -- in fact, we need not check for this
  317. // condition explicitly except for noting that we need to prompt for the
  318. // password
  319. //
  320. // case 2: -p is specified
  321. // but we need to check whether the value is specified or not
  322. // in this case user wants the utility to prompt for the password
  323. // before trying to connect
  324. //
  325. // case 3: -p * is specified
  326. // user name
  327. if ( m_pszUserName == NULL )
  328. {
  329. DEBUG_INFO;
  330. m_pszUserName = (LPTSTR) AllocateMemory( MAX_STRING_LENGTH * sizeof( WCHAR ) );
  331. if ( m_pszUserName == NULL )
  332. {
  333. SaveLastError();
  334. throw CShowError(E_OUTOFMEMORY);
  335. }
  336. DEBUG_INFO;
  337. }
  338. // password
  339. if ( m_pszPassword == NULL )
  340. {
  341. m_bNeedPassword = TRUE;
  342. m_pszPassword = (LPTSTR)AllocateMemory( MAX_STRING_LENGTH * sizeof( WCHAR ) );
  343. if ( m_pszPassword == NULL )
  344. {
  345. SaveLastError();
  346. throw CShowError(E_OUTOFMEMORY);
  347. }
  348. }
  349. // case 1
  350. if ( cmdOptions[ ID_Q_PASSWORD ].dwActuals == 0 )
  351. {
  352. // we need not do anything special here
  353. }
  354. // case 2
  355. else if ( cmdOptions[ ID_Q_PASSWORD ].pValue == NULL )
  356. {
  357. StringCopy( m_pszPassword, L"*", SIZE_OF_DYN_ARRAY(m_pszPassword));
  358. }
  359. // case 3
  360. else if ( StringCompare( m_pszPassword, L"*", TRUE, 0 ) == 0 )
  361. {
  362. if ( ReallocateMemory( (LPVOID*)&m_pszPassword,
  363. MAX_STRING_LENGTH * sizeof( WCHAR ) ) == FALSE )
  364. {
  365. SaveLastError();
  366. throw CShowError(E_OUTOFMEMORY);
  367. }
  368. // ...
  369. m_bNeedPassword = TRUE;
  370. }
  371. }
  372. DEBUG_INFO;
  373. if((TRUE == m_bNoHeader) &&(1 == cmdOptions[ ID_Q_FORMAT ].dwActuals) &&
  374. (0 == StringCompare(m_pszFormat,GetResString(IDS_STRING_LIST),TRUE,0)))
  375. {
  376. throw CShowError(IDS_HEADER_NOT_ALLOWED);
  377. }
  378. if (m_pszTriggerID && (((0 != cmdOptions[ID_Q_TRIGGERID].dwActuals) &&
  379. (0 == StringLength( m_pszTriggerID,0))) ||
  380. (0 == StringCompare( m_pszTriggerID,_T("0"),FALSE,0))))
  381. {
  382. DEBUG_INFO;
  383. throw CShowError(IDS_INVALID_ID);
  384. }
  385. }
  386. void
  387. CETQuery::Initialize()
  388. /*++
  389. Routine Description:
  390. This function will allocate memory to variables and also checks it and
  391. fills variable with value ZERO.
  392. Arguments:
  393. None
  394. Return Value:
  395. None
  396. --*/
  397. {
  398. // if at all any occurs, we know that is 'coz of the
  399. // failure in memory allocation ... so set the error
  400. SetLastError( ERROR_OUTOFMEMORY );
  401. SaveLastError();
  402. DEBUG_INFO;
  403. SecureZeroMemory(m_szBuffer,sizeof(m_szBuffer));
  404. SecureZeroMemory(m_szEventDesc,sizeof(m_szEventDesc));
  405. SecureZeroMemory(m_szTask,sizeof(m_szTask));
  406. SecureZeroMemory(m_szTaskUserName,sizeof(m_szTaskUserName));
  407. SecureZeroMemory(m_szScheduleTaskName,sizeof(m_szScheduleTaskName));
  408. m_pszEventQuery = new TCHAR[(m_lQueryColWidth)];
  409. CheckAndSetMemoryAllocation (m_pszEventQuery,(m_lQueryColWidth));
  410. m_arrColData = CreateDynamicArray();
  411. if( NULL == m_arrColData)
  412. {
  413. throw CShowError(E_OUTOFMEMORY);
  414. }
  415. SecureZeroMemory(cmdOptions, sizeof(TCMDPARSER2)* MAX_COMMANDLINE_Q_OPTION);
  416. // initialization is successful
  417. SetLastError( NOERROR ); // clear the error
  418. SetReason( L"" ); // clear the reason
  419. DEBUG_INFO;
  420. }
  421. void
  422. CETQuery::CheckAndSetMemoryAllocation(
  423. IN OUT LPTSTR pszStr,
  424. IN LONG lSize
  425. )
  426. /*++
  427. Routine Description:
  428. Function will allocate memory to a string
  429. Arguments:
  430. [in][out] pszStr : String variable to which memory to be allocated
  431. [in] : Number of bytes to be allocated.
  432. Return Value:
  433. NONE
  434. --*/
  435. {
  436. if( NULL == pszStr)
  437. {
  438. throw CShowError(E_OUTOFMEMORY);
  439. }
  440. // init to ZERO's
  441. SecureZeroMemory( pszStr, lSize * sizeof( TCHAR ) );
  442. return;
  443. }
  444. BOOL
  445. CETQuery::ExecuteQuery()
  446. /*++
  447. Routine Description:
  448. This function will execute query. This will enumerate classes from WMI
  449. to get required data.
  450. Arguments:
  451. None
  452. Return Value:
  453. None
  454. --*/
  455. {
  456. // Local variables
  457. // Holds values returned by COM functions
  458. HRESULT hr = S_OK;
  459. // status of Return value of this function.
  460. BOOL bReturn = TRUE;
  461. // stores FORMAT status values to show results
  462. DWORD dwFormatType;
  463. // COM related pointer variable. their usage is well understood by their
  464. //names.
  465. IEnumWbemClassObject *pEnumFilterToConsumerBinding = NULL;
  466. // variable used to get values from COM functions
  467. VARIANT vVariant;
  468. // Variables to store query results....
  469. TCHAR szHostName[MAX_STRING_LENGTH+1];
  470. TCHAR szEventTriggerName[MAX_TRIGGER_NAME];
  471. DWORD dwEventId = 0;
  472. HRESULT hrTemp = S_OK;
  473. // store Row number.
  474. DWORD dwRowCount = 0;
  475. BOOL bAtLeastOneEvent = FALSE;
  476. BSTR bstrConsumer = NULL;
  477. BSTR bstrFilter = NULL;
  478. BSTR bstrCmdTrigger = NULL;
  479. BOOL bAlwaysTrue = TRUE;
  480. LONG lTemp = 0;
  481. try
  482. {
  483. DEBUG_INFO;
  484. InitializeCom(&m_pWbemLocator);
  485. m_bIsCOMInitialize = TRUE;
  486. {
  487. // Temp. variabe to store user name.
  488. CHString szTempUser = m_pszUserName;
  489. // Temp. variable to store password.
  490. CHString szTempPassword = m_pszPassword;
  491. m_bLocalSystem = TRUE;
  492. DEBUG_INFO;
  493. // Connect remote / local WMI.
  494. BOOL bResult = ConnectWmiEx( m_pWbemLocator,
  495. &m_pWbemServices,
  496. m_pszServerName,
  497. szTempUser,
  498. szTempPassword,
  499. &m_pAuthIdentity,
  500. m_bNeedPassword,
  501. WMI_NAMESPACE_CIMV2,
  502. &m_bLocalSystem);
  503. if( FALSE == bResult)
  504. {
  505. DEBUG_INFO;
  506. SAFE_RELEASE_INTERFACE(pEnumFilterToConsumerBinding);
  507. ShowLastErrorEx(stderr,SLE_TYPE_ERROR|SLE_INTERNAL);
  508. return FALSE;
  509. }
  510. DEBUG_INFO;
  511. // check the remote system version and its compatiblity
  512. if ( FALSE == m_bLocalSystem)
  513. {
  514. DWORD dwVersion = 0;
  515. DEBUG_INFO;
  516. dwVersion = GetTargetVersionEx( m_pWbemServices,
  517. m_pAuthIdentity );
  518. if ( dwVersion <= 5000 ) // to block win2k versions
  519. {
  520. DEBUG_INFO;
  521. SAFE_RELEASE_INTERFACE(pEnumFilterToConsumerBinding);
  522. SetReason( E_REMOTE_INCOMPATIBLE );
  523. ShowLastErrorEx(stderr,SLE_TYPE_ERROR|SLE_INTERNAL);
  524. return FALSE;
  525. }
  526. // For XP systems.
  527. if( 5001 == dwVersion )
  528. {
  529. if( TRUE == DisplayXPResults() )
  530. {
  531. SAFE_RELEASE_INTERFACE(pEnumFilterToConsumerBinding);
  532. // Displayed triggers present.
  533. return TRUE;
  534. }
  535. else
  536. {
  537. SAFE_RELEASE_INTERFACE(pEnumFilterToConsumerBinding);
  538. // Failed to display results .
  539. // Error message is already displayed.
  540. return FALSE;
  541. }
  542. }
  543. }
  544. DEBUG_INFO;
  545. // check the local credentials and if need display warning
  546. if ( m_bLocalSystem && ( 0 != StringLength(m_pszUserName,0)))
  547. {
  548. DEBUG_INFO;
  549. WMISaveError( WBEM_E_LOCAL_CREDENTIALS );
  550. ShowLastErrorEx(stderr,SLE_TYPE_WARNING|SLE_INTERNAL);
  551. }
  552. }
  553. // If query is for remote system, make a connection to it so
  554. // that ITaskScheduler will use this connection to get
  555. // application name.
  556. DEBUG_INFO;
  557. if( FALSE == m_bLocalSystem)
  558. {
  559. if( FALSE == EstablishConnection( m_pszServerName,
  560. m_pszUserName,
  561. GetBufferSize((LPVOID)m_pszUserName)/sizeof(WCHAR),
  562. m_pszPassword,
  563. GetBufferSize((LPVOID)m_pszPassword)/sizeof(WCHAR),
  564. FALSE ))
  565. {
  566. SAFE_RELEASE_INTERFACE(pEnumFilterToConsumerBinding);
  567. ShowLastErrorEx(stderr,SLE_TYPE_ERROR|SLE_INTERNAL);
  568. return FALSE;
  569. }
  570. }
  571. DEBUG_INFO;
  572. // Password is not needed , better to free it
  573. FreeMemory((LPVOID*)& m_pszPassword);
  574. if(FALSE == SetTaskScheduler())
  575. {
  576. SAFE_RELEASE_INTERFACE(pEnumFilterToConsumerBinding);
  577. return FALSE;
  578. }
  579. DEBUG_INFO;
  580. // if -id switch is specified
  581. if( (1 == cmdOptions[ ID_Q_TRIGGERID ].dwActuals) &&
  582. (StringLength( m_pszTriggerID,0) > 0 ))
  583. {
  584. IEnumWbemClassObject *pEnumCmdTriggerConsumer = NULL;
  585. TCHAR szTemp[ MAX_STRING_LENGTH ];
  586. SecureZeroMemory(szTemp, MAX_STRING_LENGTH);
  587. StringCchPrintfW( szTemp,SIZE_OF_ARRAY(szTemp), QUERY_RANGE,
  588. m_dwLowerBound, m_dwUpperBound );
  589. DEBUG_INFO;
  590. hr = m_pWbemServices->
  591. ExecQuery( _bstr_t(QUERY_LANGUAGE), _bstr_t(szTemp),
  592. WBEM_FLAG_RETURN_IMMEDIATELY, NULL,
  593. &pEnumCmdTriggerConsumer );
  594. ON_ERROR_THROW_EXCEPTION(hr);
  595. DEBUG_INFO;
  596. hr = SetInterfaceSecurity( pEnumCmdTriggerConsumer,
  597. m_pAuthIdentity );
  598. ON_ERROR_THROW_EXCEPTION(hr);
  599. DEBUG_INFO;
  600. // retrieves CmdTriggerConsumer class
  601. bstrCmdTrigger = SysAllocString(CLS_TRIGGER_EVENT_CONSUMER);
  602. DEBUG_INFO;
  603. hr = m_pWbemServices->GetObject(bstrCmdTrigger,
  604. 0, NULL, &m_pClass, NULL);
  605. SAFE_RELEASE_BSTR(bstrCmdTrigger);
  606. ON_ERROR_THROW_EXCEPTION(hr);
  607. DEBUG_INFO;
  608. // Gets information about the "QueryETrigger( " method of
  609. // "cmdTriggerConsumer" class
  610. bstrCmdTrigger = SysAllocString(FN_QUERY_ETRIGGER);
  611. hr = m_pClass->GetMethod(bstrCmdTrigger,
  612. 0, &m_pInClass, NULL);
  613. SAFE_RELEASE_BSTR(bstrCmdTrigger);
  614. ON_ERROR_THROW_EXCEPTION(hr);
  615. DEBUG_INFO;
  616. // create a new instance of a class "TriggerEventConsumer ".
  617. hr = m_pInClass->SpawnInstance(0, &m_pInInst);
  618. ON_ERROR_THROW_EXCEPTION(hr);
  619. DEBUG_INFO;
  620. while(bAlwaysTrue)
  621. {
  622. hrTemp = S_OK;
  623. ULONG uReturned = 0;
  624. BSTR bstrTemp = NULL;
  625. CHString strTemp;
  626. hr = SetInterfaceSecurity( pEnumCmdTriggerConsumer,
  627. m_pAuthIdentity );
  628. ON_ERROR_THROW_EXCEPTION(hr);
  629. DEBUG_INFO;
  630. // Get one object starting at the current position in an
  631. //enumeration
  632. hr = pEnumCmdTriggerConsumer->Next(WBEM_INFINITE,
  633. 1,&m_pObj,&uReturned);
  634. ON_ERROR_THROW_EXCEPTION(hr);
  635. DEBUG_INFO;
  636. if( 0 == uReturned)
  637. {
  638. SAFE_RELEASE_INTERFACE(m_pObj);
  639. break;
  640. }
  641. bstrTemp = SysAllocString(FPR_TRIGGER_ID);
  642. hr = m_pObj->Get(bstrTemp,
  643. 0, &vVariant, 0, 0);
  644. if(FAILED(hr))
  645. {
  646. if( WBEM_E_NOT_FOUND == hr)
  647. {
  648. continue;
  649. }
  650. ON_ERROR_THROW_EXCEPTION(hr);
  651. }
  652. SAFE_RELEASE_BSTR(bstrTemp);
  653. DEBUG_INFO;
  654. dwEventId = vVariant.lVal ;
  655. hr = VariantClear(&vVariant);
  656. ON_ERROR_THROW_EXCEPTION(hr);
  657. // Retrieves the "TaskScheduler" information
  658. bstrTemp = SysAllocString(FPR_TASK_SCHEDULER);
  659. hr = m_pObj->Get(bstrTemp, 0, &vVariant, 0, 0);
  660. ON_ERROR_THROW_EXCEPTION(hr);
  661. DEBUG_INFO;
  662. SAFE_RELEASE_BSTR(bstrTemp);
  663. hrTemp = GetRunAsUserName((LPCWSTR)_bstr_t(vVariant.bstrVal));
  664. if (FAILED(hrTemp) && (ERROR_TRIGGER_CORRUPTED != hrTemp))
  665. {
  666. // This is because user does not has enough rights
  667. // to see schtasks. Continue with next trigger.
  668. SAFE_RELEASE_INTERFACE(m_pObj);
  669. SAFE_RELEASE_INTERFACE(m_pTriggerEventConsumer);
  670. SAFE_RELEASE_INTERFACE(m_pEventFilter);
  671. continue;
  672. }
  673. StringCopy(m_szScheduleTaskName,(LPCWSTR)_bstr_t(vVariant.bstrVal),SIZE_OF_ARRAY(m_szScheduleTaskName));
  674. hr = VariantClear(&vVariant);
  675. ON_ERROR_THROW_EXCEPTION(hr);
  676. // TriggerName
  677. //retrieves the 'TriggerName' value if exits
  678. bstrTemp = SysAllocString(FPR_TRIGGER_NAME);
  679. hr = m_pObj->Get(bstrTemp, 0, &vVariant, 0, 0);
  680. ON_ERROR_THROW_EXCEPTION(hr);
  681. SAFE_RELEASE_BSTR(bstrTemp);
  682. StringCopy(szEventTriggerName,vVariant.bstrVal,MAX_RES_STRING);
  683. hr = VariantClear(&vVariant);
  684. ON_ERROR_THROW_EXCEPTION(hr);
  685. //retrieves the 'TriggerDesc' value if exits
  686. bstrTemp = SysAllocString(FPR_TRIGGER_DESC);
  687. hr = m_pObj->Get(bstrTemp, 0, &vVariant, 0, 0);
  688. ON_ERROR_THROW_EXCEPTION(hr);
  689. SAFE_RELEASE_BSTR(bstrTemp);
  690. StringCopy(m_szBuffer,(_TCHAR*)_bstr_t(vVariant.bstrVal),
  691. SIZE_OF_ARRAY(m_szBuffer));
  692. lTemp = StringLength(m_szBuffer,0);
  693. DEBUG_INFO;
  694. StringCopy(m_szEventDesc,m_szBuffer,
  695. SIZE_OF_ARRAY(m_szEventDesc));
  696. hr = VariantClear(&vVariant);
  697. ON_ERROR_THROW_EXCEPTION(hr);
  698. DEBUG_INFO;
  699. // Host Name
  700. //retrieves the '__SERVER' value if exits
  701. bstrTemp = SysAllocString(L"__SERVER");
  702. hr = m_pObj->Get(bstrTemp, 0, &vVariant, 0, 0);
  703. ON_ERROR_THROW_EXCEPTION(hr);
  704. SAFE_RELEASE_BSTR(bstrTemp);
  705. StringCopy(szHostName, vVariant.bstrVal,SIZE_OF_ARRAY(szHostName));
  706. DEBUG_INFO;
  707. DEBUG_INFO;
  708. if (ERROR_TRIGGER_CORRUPTED != hrTemp)
  709. {
  710. //retrieves the 'Action' value if exits
  711. hr = GetApplicationToRun();
  712. ON_ERROR_THROW_EXCEPTION(hr);
  713. DEBUG_INFO;
  714. /*
  715. bstrTemp = SysAllocString(L"Action");
  716. hr = m_pObj->Get(bstrTemp, 0, &vVariant, 0, 0);
  717. ON_ERROR_THROW_EXCEPTION(hr);
  718. SAFE_RELEASE_BSTR(bstrTemp);
  719. StringCopy(m_szBuffer,(_TCHAR*)_bstr_t(vVariant.bstrVal),
  720. SIZE_OF_ARRAY(m_szBuffer));
  721. lTemp = StringLength(m_szBuffer,0);
  722. StringCopy(m_szTask, m_szBuffer, SIZE_OF_ARRAY(m_szTask));
  723. hr = VariantClear(&vVariant);
  724. ON_ERROR_THROW_EXCEPTION(hr);
  725. */
  726. StringCopy(szTemp,L"",SIZE_OF_ARRAY(szTemp));
  727. StringCchPrintfW( szTemp, SIZE_OF_ARRAY(szTemp),
  728. BINDING_CLASS_QUERY, dwEventId);
  729. DEBUG_INFO;
  730. hr = m_pWbemServices->ExecQuery( _bstr_t(QUERY_LANGUAGE),
  731. _bstr_t(szTemp),
  732. WBEM_FLAG_RETURN_IMMEDIATELY,
  733. NULL,
  734. &pEnumFilterToConsumerBinding);
  735. ON_ERROR_THROW_EXCEPTION(hr);
  736. DEBUG_INFO;
  737. hr = SetInterfaceSecurity( pEnumFilterToConsumerBinding,
  738. m_pAuthIdentity );
  739. ON_ERROR_THROW_EXCEPTION(hr);
  740. DEBUG_INFO;
  741. // Get one object starting at the current position in an
  742. //enumeration
  743. SAFE_RELEASE_INTERFACE(m_pClass);
  744. hr = pEnumFilterToConsumerBinding->Next(WBEM_INFINITE,
  745. 1,&m_pClass,&uReturned);
  746. ON_ERROR_THROW_EXCEPTION(hr);
  747. DEBUG_INFO;
  748. if( 0 == uReturned )
  749. {
  750. SAFE_RELEASE_INTERFACE(pEnumFilterToConsumerBinding);
  751. SAFE_RELEASE_INTERFACE(m_pObj);
  752. SAFE_RELEASE_INTERFACE(m_pTriggerEventConsumer);
  753. SAFE_RELEASE_INTERFACE(m_pEventFilter);
  754. continue;
  755. }
  756. DEBUG_INFO;
  757. bstrTemp = SysAllocString(L"Filter");
  758. hr = m_pClass->Get(bstrTemp, 0, &vVariant, 0, 0);
  759. SAFE_RELEASE_BSTR(bstrTemp);
  760. ON_ERROR_THROW_EXCEPTION(hr);
  761. bstrFilter = SysAllocString(vVariant.bstrVal);
  762. hr = VariantClear(&vVariant);
  763. ON_ERROR_THROW_EXCEPTION(hr);
  764. DEBUG_INFO;
  765. hr = m_pWbemServices->GetObject( bstrFilter,
  766. 0,
  767. NULL,
  768. &m_pEventFilter,
  769. NULL);
  770. SAFE_RELEASE_BSTR(bstrFilter);
  771. DEBUG_INFO;
  772. if(FAILED(hr))
  773. {
  774. if( WBEM_E_NOT_FOUND == hr)
  775. continue;
  776. ON_ERROR_THROW_EXCEPTION(hr);
  777. }
  778. DEBUG_INFO;
  779. hr = VariantClear(&vVariant);
  780. ON_ERROR_THROW_EXCEPTION(hr);
  781. bstrTemp = SysAllocString(L"Query");
  782. hr = m_pEventFilter->Get(bstrTemp, 0, &vVariant, 0, 0);
  783. SAFE_RELEASE_BSTR(bstrTemp);
  784. ON_ERROR_THROW_EXCEPTION(hr);
  785. StringCopy(m_szBuffer,(_TCHAR*)_bstr_t(vVariant.bstrVal),
  786. SIZE_OF_ARRAY(m_szBuffer));
  787. hr = VariantClear(&vVariant);
  788. ON_ERROR_THROW_EXCEPTION(hr);
  789. DEBUG_INFO;
  790. FindAndReplace(m_szBuffer,QUERY_STRING_AND,SHOW_WQL_QUERY);
  791. FindAndReplace(m_szBuffer,L"targetinstance.LogFile",L"Log");
  792. FindAndReplace(m_szBuffer,L"targetinstance.Type",L"Type");
  793. FindAndReplace(m_szBuffer,L"targetinstance.EventCode",L"Id");
  794. FindAndReplace(m_szBuffer,
  795. L"targetinstance.SourceName",L"Source");
  796. DEBUG_INFO;
  797. // Remove extra spaces
  798. FindAndReplace( m_szBuffer,L" ",L" ");
  799. // Remove extra spaces
  800. FindAndReplace(m_szBuffer,L" ",L" ");
  801. lTemp = StringLength(m_szBuffer,0);
  802. // for the safer size for allocation of memory.
  803. // allocates memory only if new WQL is greate than previous one.
  804. lTemp += 4;
  805. if(lTemp > m_lWQLColWidth)
  806. {
  807. DEBUG_INFO;
  808. // first free it (if previously allocated)
  809. RELEASE_MEMORY_EX(m_pszEventQuery);
  810. m_pszEventQuery = new TCHAR[lTemp+1];
  811. CheckAndSetMemoryAllocation(m_pszEventQuery,lTemp);
  812. }
  813. lTemp = m_lWQLColWidth;
  814. CalcColWidth(lTemp,&m_lWQLColWidth,m_szBuffer);
  815. // Now manipulate the WQL string to get EventQuery....
  816. FindAndReplace(m_szBuffer,SHOW_WQL_QUERY,
  817. GetResString(IDS_EVENTS_WITH));
  818. //to remove extra spaces
  819. FindAndReplace(m_szBuffer,L" ",L" ");
  820. //to remove extra spaces
  821. FindAndReplace( m_szBuffer,L" ",L" ");
  822. StringCopy( m_pszEventQuery,m_szBuffer,
  823. SIZE_OF_NEW_ARRAY(m_pszEventQuery));
  824. DEBUG_INFO;
  825. }
  826. else
  827. {
  828. StringCopy(m_szTask,TRIGGER_CORRUPTED,SIZE_OF_ARRAY(m_szTask));
  829. // first free it (if previously allocated)
  830. RELEASE_MEMORY_EX(m_pszEventQuery);
  831. m_pszEventQuery = new TCHAR[MAX_STRING_LENGTH];
  832. CheckAndSetMemoryAllocation(m_pszEventQuery,MAX_STRING_LENGTH);
  833. StringCopy(m_pszEventQuery,GetResString(IDS_ID_NA),SIZE_OF_NEW_ARRAY(m_pszEventQuery));
  834. StringCopy(m_szTaskUserName,GetResString(IDS_ID_NA),SIZE_OF_ARRAY(m_szTaskUserName));
  835. }
  836. // Now Shows the results on screen
  837. // Appends for in m_arrColData array
  838. dwRowCount = DynArrayAppendRow( m_arrColData, NO_OF_COLUMNS );
  839. // Fills Results in m_arrColData data structure
  840. DynArraySetString2( m_arrColData, dwRowCount, HOST_NAME,
  841. szHostName,0);
  842. DynArraySetDWORD2( m_arrColData , dwRowCount,
  843. TRIGGER_ID,dwEventId);
  844. DynArraySetString2( m_arrColData, dwRowCount, TRIGGER_NAME,
  845. szEventTriggerName,0);
  846. DynArraySetString2( m_arrColData, dwRowCount, TASK,
  847. m_szTask,0);
  848. DynArraySetString2( m_arrColData, dwRowCount, EVENT_QUERY,
  849. m_pszEventQuery,0);
  850. DynArraySetString2( m_arrColData, dwRowCount, EVENT_DESCRIPTION,
  851. m_szEventDesc,0);
  852. DynArraySetString2( m_arrColData, dwRowCount, TASK_USERNAME,
  853. m_szTaskUserName,0);
  854. bAtLeastOneEvent = TRUE;
  855. // Calculatate new column width for each column
  856. lTemp = m_lHostNameColWidth;
  857. CalcColWidth(lTemp,&m_lHostNameColWidth,szHostName);
  858. lTemp = m_lETNameColWidth;
  859. CalcColWidth(lTemp,&m_lETNameColWidth,szEventTriggerName);
  860. lTemp = m_lTaskColWidth;
  861. CalcColWidth(lTemp,&m_lTaskColWidth,m_szTask);
  862. lTemp = m_lQueryColWidth;
  863. CalcColWidth(lTemp,&m_lQueryColWidth,m_pszEventQuery);
  864. lTemp = m_lDescriptionColWidth;
  865. CalcColWidth(lTemp,&m_lDescriptionColWidth,m_szEventDesc);
  866. // Resets current containts..if any
  867. StringCopy(szHostName, L"",SIZE_OF_ARRAY(szHostName));
  868. dwEventId = 0;
  869. StringCopy(szEventTriggerName,L"",SIZE_OF_ARRAY(szEventTriggerName));
  870. StringCopy( m_szTask, L"",
  871. SIZE_OF_ARRAY(m_szTask));
  872. StringCopy(m_pszEventQuery,L"",SIZE_OF_NEW_ARRAY(m_pszEventQuery));
  873. StringCopy(m_szEventDesc,L"",SIZE_OF_ARRAY(m_szEventDesc));
  874. SAFE_RELEASE_INTERFACE(m_pObj);
  875. SAFE_RELEASE_INTERFACE(m_pTriggerEventConsumer);
  876. SAFE_RELEASE_INTERFACE(m_pEventFilter);
  877. DEBUG_INFO;
  878. }
  879. }
  880. else
  881. {
  882. //Following method will creates an enumerator that returns the
  883. // instances of a specified __FilterToConsumerBinding class
  884. bstrConsumer = SysAllocString(CLS_FILTER_TO_CONSUMERBINDING);
  885. DEBUG_INFO;
  886. hr = m_pWbemServices->
  887. CreateInstanceEnum(bstrConsumer,
  888. WBEM_FLAG_SHALLOW,
  889. NULL,
  890. &pEnumFilterToConsumerBinding);
  891. SAFE_RELEASE_BSTR(bstrConsumer);
  892. ON_ERROR_THROW_EXCEPTION(hr);
  893. DEBUG_INFO;
  894. hr = SetInterfaceSecurity( pEnumFilterToConsumerBinding,
  895. m_pAuthIdentity );
  896. ON_ERROR_THROW_EXCEPTION(hr);
  897. // retrieves CmdTriggerConsumer class
  898. bstrCmdTrigger = SysAllocString(CLS_TRIGGER_EVENT_CONSUMER);
  899. hr = m_pWbemServices->GetObject(bstrCmdTrigger,
  900. 0, NULL, &m_pClass, NULL);
  901. SAFE_RELEASE_BSTR(bstrCmdTrigger);
  902. ON_ERROR_THROW_EXCEPTION(hr);
  903. DEBUG_INFO;
  904. // Gets information about the "QueryETrigger( " method of
  905. // "cmdTriggerConsumer" class
  906. bstrCmdTrigger = SysAllocString(FN_QUERY_ETRIGGER);
  907. hr = m_pClass->GetMethod(bstrCmdTrigger,
  908. 0, &m_pInClass, NULL);
  909. SAFE_RELEASE_BSTR(bstrCmdTrigger);
  910. ON_ERROR_THROW_EXCEPTION(hr);
  911. DEBUG_INFO;
  912. // create a new instance of a class "TriggerEventConsumer ".
  913. hr = m_pInClass->SpawnInstance(0, &m_pInInst);
  914. ON_ERROR_THROW_EXCEPTION(hr);
  915. while(bAlwaysTrue)
  916. {
  917. // Holds no. of object returns from Next mathod.
  918. ULONG uReturned = 0;
  919. BSTR bstrTemp = NULL;
  920. CHString strTemp;
  921. // set the security at the interface level also
  922. hr = SetInterfaceSecurity( pEnumFilterToConsumerBinding,
  923. m_pAuthIdentity );
  924. ON_ERROR_THROW_EXCEPTION(hr);
  925. // Get one object starting at the current position in an
  926. //enumeration
  927. hr = pEnumFilterToConsumerBinding->Next(WBEM_INFINITE,
  928. 1,&m_pObj,&uReturned);
  929. ON_ERROR_THROW_EXCEPTION(hr);
  930. if( 0 == uReturned )
  931. {
  932. SAFE_RELEASE_INTERFACE(m_pObj);
  933. break;
  934. }
  935. DEBUG_INFO;
  936. VariantInit(&vVariant);
  937. SAFE_RELEASE_BSTR(bstrTemp);
  938. bstrTemp = SysAllocString(L"Consumer");
  939. hr = m_pObj->Get(bstrTemp, 0, &vVariant, 0, 0);
  940. SAFE_RELEASE_BSTR(bstrTemp);
  941. ON_ERROR_THROW_EXCEPTION(hr);
  942. bstrConsumer =SysAllocString( vVariant.bstrVal);
  943. hr = VariantClear(&vVariant);
  944. ON_ERROR_THROW_EXCEPTION(hr);
  945. // Search for trggereventconsumer string as we are interested
  946. // to get object from this class only
  947. strTemp = bstrConsumer;
  948. if( -1 == strTemp.Find(CLS_TRIGGER_EVENT_CONSUMER))
  949. {
  950. SAFE_RELEASE_BSTR(bstrConsumer);
  951. continue;
  952. }
  953. hr = SetInterfaceSecurity( m_pWbemServices,
  954. m_pAuthIdentity );
  955. ON_ERROR_THROW_EXCEPTION(hr);
  956. DEBUG_INFO;
  957. hr = m_pWbemServices->GetObject(bstrConsumer,
  958. 0,
  959. NULL,
  960. &m_pTriggerEventConsumer,
  961. NULL);
  962. SAFE_RELEASE_BSTR(bstrConsumer);
  963. if(FAILED(hr))
  964. {
  965. if( WBEM_E_NOT_FOUND == hr)
  966. {
  967. continue;
  968. }
  969. ON_ERROR_THROW_EXCEPTION(hr);
  970. }
  971. DEBUG_INFO;
  972. bstrTemp = SysAllocString(L"Filter");
  973. hr = m_pObj->Get(bstrTemp, 0, &vVariant, 0, 0);
  974. SAFE_RELEASE_BSTR(bstrTemp);
  975. ON_ERROR_THROW_EXCEPTION(hr);
  976. bstrFilter = SysAllocString(vVariant.bstrVal);
  977. hr = VariantClear(&vVariant);
  978. ON_ERROR_THROW_EXCEPTION(hr);
  979. hr = m_pWbemServices->GetObject(
  980. bstrFilter,
  981. 0,
  982. NULL,
  983. &m_pEventFilter,
  984. NULL);
  985. SAFE_RELEASE_BSTR(bstrFilter);
  986. if(FAILED(hr))
  987. {
  988. if( WBEM_E_NOT_FOUND == hr)
  989. {
  990. continue;
  991. }
  992. ON_ERROR_THROW_EXCEPTION(hr);
  993. }
  994. DEBUG_INFO;
  995. //retrieves the 'TriggerID' value if exits
  996. bstrTemp = SysAllocString(FPR_TRIGGER_ID);
  997. hr = m_pTriggerEventConsumer->Get(bstrTemp,
  998. 0, &vVariant, 0, 0);
  999. if(FAILED(hr))
  1000. {
  1001. if( WBEM_E_NOT_FOUND == hr)
  1002. {
  1003. continue;
  1004. }
  1005. ON_ERROR_THROW_EXCEPTION(hr);
  1006. }
  1007. SAFE_RELEASE_BSTR(bstrTemp);
  1008. DEBUG_INFO;
  1009. dwEventId = vVariant.lVal ;
  1010. hr = VariantClear(&vVariant);
  1011. ON_ERROR_THROW_EXCEPTION(hr);
  1012. // Retrieves the "TaskScheduler" information
  1013. bstrTemp = SysAllocString(FPR_TASK_SCHEDULER);
  1014. DEBUG_INFO;
  1015. hr = m_pTriggerEventConsumer->Get(bstrTemp, 0, &vVariant, 0, 0);
  1016. ON_ERROR_THROW_EXCEPTION(hr);
  1017. DEBUG_INFO;
  1018. SAFE_RELEASE_BSTR(bstrTemp);
  1019. DEBUG_INFO;
  1020. hrTemp = GetRunAsUserName((LPCWSTR)_bstr_t(vVariant.bstrVal));
  1021. DEBUG_INFO;
  1022. if (FAILED(hrTemp) && (ERROR_TRIGGER_CORRUPTED != hrTemp))
  1023. {
  1024. // This is because user does not has enough rights
  1025. // to see schtasks. Continue with next trigger.
  1026. DEBUG_INFO;
  1027. SAFE_RELEASE_INTERFACE(m_pObj);
  1028. SAFE_RELEASE_INTERFACE(m_pTriggerEventConsumer);
  1029. SAFE_RELEASE_INTERFACE(m_pEventFilter);
  1030. continue;
  1031. }
  1032. StringCopy(m_szScheduleTaskName,(LPCWSTR)_bstr_t(vVariant.bstrVal),SIZE_OF_ARRAY(m_szScheduleTaskName));
  1033. hr = VariantClear(&vVariant);
  1034. ON_ERROR_THROW_EXCEPTION(hr);
  1035. // TriggerName
  1036. //retrieves the 'TriggerName' value if exits
  1037. bstrTemp = SysAllocString(FPR_TRIGGER_NAME);
  1038. hr = m_pTriggerEventConsumer->Get(bstrTemp, 0, &vVariant, 0,0);
  1039. ON_ERROR_THROW_EXCEPTION(hr);
  1040. SAFE_RELEASE_BSTR(bstrTemp);
  1041. StringCopy(szEventTriggerName,vVariant.bstrVal,MAX_RES_STRING);
  1042. hr = VariantClear(&vVariant);
  1043. ON_ERROR_THROW_EXCEPTION(hr);
  1044. DEBUG_INFO;
  1045. //retrieves the 'TriggerDesc' value if exits
  1046. bstrTemp = SysAllocString(FPR_TRIGGER_DESC);
  1047. hr = m_pTriggerEventConsumer->Get(bstrTemp, 0, &vVariant, 0, 0);
  1048. ON_ERROR_THROW_EXCEPTION(hr);
  1049. SAFE_RELEASE_BSTR(bstrTemp);
  1050. StringCopy(m_szBuffer,(_TCHAR*)_bstr_t(vVariant.bstrVal),
  1051. SIZE_OF_ARRAY(m_szBuffer));
  1052. lTemp = StringLength(m_szBuffer,0);
  1053. // Means description is not available make it N/A.
  1054. if( 0 == lTemp)
  1055. {
  1056. StringCopy(m_szBuffer,GetResString(IDS_ID_NA),SIZE_OF_ARRAY(m_szBuffer));
  1057. lTemp = StringLength(m_szBuffer,0);
  1058. }
  1059. StringCopy(m_szEventDesc,m_szBuffer,SIZE_OF_ARRAY(m_szEventDesc));
  1060. hr = VariantClear(&vVariant);
  1061. ON_ERROR_THROW_EXCEPTION(hr);
  1062. // Host Name
  1063. //retrieves the '__SERVER' value if exits
  1064. bstrTemp = SysAllocString(L"__SERVER");
  1065. hr = m_pTriggerEventConsumer->Get(bstrTemp, 0, &vVariant, 0,0);
  1066. ON_ERROR_THROW_EXCEPTION(hr);
  1067. SAFE_RELEASE_BSTR(bstrTemp);
  1068. StringCopy(szHostName, vVariant.bstrVal,SIZE_OF_ARRAY(szHostName));
  1069. if ( ERROR_TRIGGER_CORRUPTED != hrTemp)
  1070. {
  1071. hr = GetApplicationToRun();
  1072. ON_ERROR_THROW_EXCEPTION(hr);
  1073. DEBUG_INFO;
  1074. /*
  1075. //retrieves the 'Action' value if exits
  1076. bstrTemp = SysAllocString(L"Action");
  1077. hr = m_pTriggerEventConsumer->Get(bstrTemp, 0, &vVariant, 0, 0);
  1078. ON_ERROR_THROW_EXCEPTION(hr);
  1079. SAFE_RELEASE_BSTR(bstrTemp);
  1080. StringCopy(m_szBuffer,(_TCHAR*)_bstr_t(vVariant.bstrVal),
  1081. SIZE_OF_ARRAY(m_szBuffer));
  1082. StringCopy(m_szTask, m_szBuffer,SIZE_OF_ARRAY(m_szTask));
  1083. hr = VariantClear(&vVariant);
  1084. ON_ERROR_THROW_EXCEPTION(hr);
  1085. hr = VariantClear(&vVariant);
  1086. ON_ERROR_THROW_EXCEPTION(hr);
  1087. */
  1088. bstrTemp = SysAllocString(L"Query");
  1089. hr = m_pEventFilter->Get(bstrTemp, 0, &vVariant, 0, 0);
  1090. SAFE_RELEASE_BSTR(bstrTemp);
  1091. ON_ERROR_THROW_EXCEPTION(hr);
  1092. DEBUG_INFO;
  1093. StringCopy(m_szBuffer,(_TCHAR*)_bstr_t(vVariant.bstrVal),
  1094. SIZE_OF_ARRAY(m_szBuffer));
  1095. hr = VariantClear(&vVariant);
  1096. ON_ERROR_THROW_EXCEPTION(hr);
  1097. DEBUG_INFO;
  1098. FindAndReplace(m_szBuffer,QUERY_STRING_AND,SHOW_WQL_QUERY);
  1099. FindAndReplace(m_szBuffer,L"targetinstance.LogFile",L"Log");
  1100. FindAndReplace(m_szBuffer,L"targetinstance.Type",L"Type");
  1101. FindAndReplace(m_szBuffer,L"targetinstance.EventCode",L"Id");
  1102. FindAndReplace(m_szBuffer,
  1103. L"targetinstance.SourceName",L"Source");
  1104. //to remove extra spaces
  1105. FindAndReplace(m_szBuffer,L" ",L" ");
  1106. //to remove extra spaces
  1107. FindAndReplace( m_szBuffer,L" ",L" ");
  1108. lTemp = StringLength(m_szBuffer,0);
  1109. // for the safer size for allocation of memory.
  1110. // allocates memory only if new WQL is greate than previous one.
  1111. lTemp += 4;
  1112. if(lTemp > m_lWQLColWidth)
  1113. {
  1114. DEBUG_INFO;
  1115. // first free it (if previously allocated)
  1116. RELEASE_MEMORY_EX(m_pszEventQuery);
  1117. m_pszEventQuery = new TCHAR[lTemp+1];
  1118. CheckAndSetMemoryAllocation(m_pszEventQuery,lTemp);
  1119. }
  1120. lTemp = m_lWQLColWidth;
  1121. CalcColWidth(lTemp,&m_lWQLColWidth,m_szBuffer);
  1122. // Now manipulate the WQL string to get EventQuery....
  1123. FindAndReplace(m_szBuffer,SHOW_WQL_QUERY,
  1124. GetResString(IDS_EVENTS_WITH));
  1125. // Remove extra spaces.
  1126. FindAndReplace(m_szBuffer,L" ",L" ");
  1127. // Remove extra spaces.
  1128. FindAndReplace(m_szBuffer,L" ",L" ");
  1129. StringCopy(m_pszEventQuery,m_szBuffer,
  1130. SIZE_OF_NEW_ARRAY(m_pszEventQuery));
  1131. DEBUG_INFO;
  1132. }
  1133. else
  1134. {
  1135. StringCopy(m_szTask,TRIGGER_CORRUPTED,SIZE_OF_ARRAY(m_szTask));
  1136. // first free it (if previously allocated)
  1137. RELEASE_MEMORY_EX(m_pszEventQuery);
  1138. m_pszEventQuery = new TCHAR[MAX_STRING_LENGTH];
  1139. CheckAndSetMemoryAllocation(m_pszEventQuery,MAX_STRING_LENGTH);
  1140. StringCopy(m_pszEventQuery,GetResString(IDS_ID_NA),SIZE_OF_NEW_ARRAY(m_pszEventQuery));
  1141. StringCopy(m_szTaskUserName,GetResString(IDS_ID_NA),SIZE_OF_ARRAY(m_szTaskUserName));
  1142. }
  1143. // Now Shows the results on screen
  1144. // Appends for in m_arrColData array
  1145. dwRowCount = DynArrayAppendRow( m_arrColData, NO_OF_COLUMNS );
  1146. DEBUG_INFO;
  1147. // if hrTemp == ERROR_TRIGGER_CORRUPTED,
  1148. // fill all the columns with "Trigger Corrupted except
  1149. // Trigger id and Trigger Name
  1150. // Fills Results in m_arrColData data structure
  1151. DynArraySetString2(m_arrColData,dwRowCount,
  1152. HOST_NAME,szHostName,0);
  1153. DynArraySetDWORD2( m_arrColData , dwRowCount, TRIGGER_ID,
  1154. dwEventId);
  1155. DynArraySetString2( m_arrColData, dwRowCount, TRIGGER_NAME,
  1156. szEventTriggerName,0);
  1157. DynArraySetString2( m_arrColData, dwRowCount, TASK,
  1158. m_szTask,0);
  1159. DynArraySetString2( m_arrColData, dwRowCount, EVENT_QUERY,
  1160. m_pszEventQuery,0);
  1161. DynArraySetString2( m_arrColData, dwRowCount, EVENT_DESCRIPTION,
  1162. m_szEventDesc,0);
  1163. DynArraySetString2( m_arrColData, dwRowCount, TASK_USERNAME,
  1164. m_szTaskUserName,0);
  1165. bAtLeastOneEvent = TRUE;
  1166. // Calculatate new column width for each column
  1167. lTemp = m_lHostNameColWidth;
  1168. CalcColWidth(lTemp,&m_lHostNameColWidth,szHostName);
  1169. lTemp = m_lETNameColWidth;
  1170. CalcColWidth(lTemp,&m_lETNameColWidth,szEventTriggerName);
  1171. lTemp = m_lTaskColWidth;
  1172. CalcColWidth(lTemp,&m_lTaskColWidth,m_szTask);
  1173. lTemp = m_lQueryColWidth;
  1174. CalcColWidth(lTemp,&m_lQueryColWidth,m_pszEventQuery);
  1175. lTemp = m_lDescriptionColWidth;
  1176. CalcColWidth(lTemp,&m_lDescriptionColWidth,m_szEventDesc);
  1177. // Resets current containts..if any
  1178. StringCopy(szHostName, L"",SIZE_OF_ARRAY(szHostName));
  1179. dwEventId = 0;
  1180. StringCopy(szEventTriggerName, L"",SIZE_OF_ARRAY(szEventTriggerName));
  1181. StringCopy(m_szTask, L"",SIZE_OF_ARRAY(m_szTask));
  1182. StringCopy(m_pszEventQuery, L"",SIZE_OF_NEW_ARRAY(m_pszEventQuery));
  1183. StringCopy(m_szEventDesc,L"",SIZE_OF_ARRAY(m_szEventDesc));
  1184. SAFE_RELEASE_INTERFACE(m_pObj);
  1185. SAFE_RELEASE_INTERFACE(m_pTriggerEventConsumer);
  1186. SAFE_RELEASE_INTERFACE(m_pEventFilter);
  1187. DEBUG_INFO;
  1188. } // End of while
  1189. }
  1190. if(0 == StringCompare( m_pszFormat,GetResString(IDS_STRING_TABLE),
  1191. TRUE,0))
  1192. {
  1193. dwFormatType = SR_FORMAT_TABLE;
  1194. }
  1195. else if(0 == StringCompare( m_pszFormat,
  1196. GetResString(IDS_STRING_LIST),TRUE,0))
  1197. {
  1198. dwFormatType = SR_FORMAT_LIST;
  1199. }
  1200. else if(0 == StringCompare( m_pszFormat,
  1201. GetResString(IDS_STRING_CSV),TRUE,0))
  1202. {
  1203. dwFormatType = SR_FORMAT_CSV;
  1204. }
  1205. else // Default
  1206. {
  1207. dwFormatType = SR_FORMAT_TABLE;
  1208. }
  1209. if( TRUE == bAtLeastOneEvent)
  1210. {
  1211. // Show Final Query Results on screen
  1212. PrepareColumns ();
  1213. DEBUG_INFO;
  1214. if ( FALSE == IsSchSvrcRunning())
  1215. {
  1216. DEBUG_INFO;
  1217. ShowMessage(stderr,GetResString(IDS_SERVICE_NOT_RUNNING));
  1218. }
  1219. if((SR_FORMAT_CSV & dwFormatType) != SR_FORMAT_CSV)
  1220. {
  1221. ShowMessage(stdout,BLANK_LINE);
  1222. }
  1223. if( TRUE == m_bNoHeader)
  1224. {
  1225. dwFormatType |=SR_NOHEADER;
  1226. }
  1227. ShowResults(NO_OF_COLUMNS,mainCols,dwFormatType,m_arrColData);
  1228. }
  1229. else if( StringLength(m_pszTriggerID,0)> 0)
  1230. {
  1231. // Show Message
  1232. TCHAR szErrorMsg[MAX_RES_STRING+1];
  1233. TCHAR szMsgFormat[MAX_RES_STRING+1];
  1234. StringCopy(szMsgFormat,GetResString(IDS_NO_EVENTID_FOUND),
  1235. SIZE_OF_ARRAY(szMsgFormat));
  1236. StringCchPrintfW(szErrorMsg, SIZE_OF_ARRAY(szErrorMsg),
  1237. szMsgFormat,m_pszTriggerID);
  1238. ShowMessage(stdout,szErrorMsg);
  1239. }
  1240. else
  1241. {
  1242. // Show Message
  1243. ShowMessage(stdout,GetResString(IDS_NO_EVENT_FOUNT));
  1244. }
  1245. }
  1246. catch(_com_error)
  1247. {
  1248. DEBUG_INFO;
  1249. SAFE_RELEASE_INTERFACE(pEnumFilterToConsumerBinding);
  1250. // WMI returns string for this hr value is "Not Found." which is not
  1251. // user friendly. So changing the message text.
  1252. if( 0x80041002 == hr )
  1253. {
  1254. ShowMessage( stderr,GetResString(IDS_CLASS_NOT_REG));
  1255. }
  1256. else
  1257. {
  1258. DEBUG_INFO;
  1259. ShowLastErrorEx(stderr,SLE_TYPE_ERROR|SLE_INTERNAL);
  1260. }
  1261. return FALSE;
  1262. }
  1263. DEBUG_INFO;
  1264. SAFE_RELEASE_INTERFACE(pEnumFilterToConsumerBinding);
  1265. return TRUE;
  1266. }
  1267. void
  1268. CETQuery::PrepareColumns()
  1269. /*++
  1270. Routine Description:
  1271. This function will prepare/fill structure which will be used to show
  1272. output data.
  1273. Arguments:
  1274. None
  1275. Return Value:
  1276. None
  1277. --*/
  1278. {
  1279. DEBUG_INFO;
  1280. // For non verbose mode output, column width is predefined else
  1281. // use dynamically calculated column width.
  1282. m_lETNameColWidth = m_bVerbose?m_lETNameColWidth:V_WIDTH_TRIG_NAME;
  1283. m_lTaskColWidth = m_bVerbose?m_lTaskColWidth:V_WIDTH_TASK;
  1284. m_lTriggerIDColWidth = m_bVerbose?m_lTriggerIDColWidth:V_WIDTH_TRIG_ID;
  1285. StringCopy(mainCols[HOST_NAME].szColumn,COL_HOSTNAME,SIZE_OF_ARRAY(mainCols[HOST_NAME].szColumn));
  1286. mainCols[HOST_NAME].dwWidth = m_lHostNameColWidth;
  1287. if( TRUE == m_bVerbose)
  1288. {
  1289. mainCols[HOST_NAME].dwFlags = SR_TYPE_STRING;
  1290. }
  1291. else
  1292. {
  1293. mainCols[HOST_NAME].dwFlags = SR_HIDECOLUMN|SR_TYPE_STRING;
  1294. }
  1295. StringCopy(mainCols[HOST_NAME].szFormat,L"%s",SIZE_OF_ARRAY(mainCols[HOST_NAME].szFormat));
  1296. mainCols[HOST_NAME].pFunction = NULL;
  1297. mainCols[HOST_NAME].pFunctionData = NULL;
  1298. StringCopy(mainCols[TRIGGER_ID].szColumn,COL_TRIGGER_ID,SIZE_OF_ARRAY(mainCols[TRIGGER_ID].szColumn));
  1299. mainCols[TRIGGER_ID].dwWidth = m_lTriggerIDColWidth;
  1300. mainCols[TRIGGER_ID].dwFlags = SR_TYPE_NUMERIC;
  1301. StringCopy(mainCols[TRIGGER_ID].szFormat,L"%d",SIZE_OF_ARRAY(mainCols[TRIGGER_ID].szFormat));
  1302. mainCols[TRIGGER_ID].pFunction = NULL;
  1303. mainCols[TRIGGER_ID].pFunctionData = NULL;
  1304. StringCopy(mainCols[TRIGGER_NAME].szColumn,COL_TRIGGER_NAME,
  1305. SIZE_OF_ARRAY(mainCols[TRIGGER_NAME].szColumn));
  1306. mainCols[TRIGGER_NAME].dwWidth = m_lETNameColWidth;
  1307. mainCols[TRIGGER_NAME].dwFlags = SR_TYPE_STRING;
  1308. StringCopy(mainCols[TRIGGER_NAME].szFormat,L"%s",
  1309. SIZE_OF_ARRAY(mainCols[TRIGGER_NAME].szFormat));
  1310. mainCols[TRIGGER_NAME].pFunction = NULL;
  1311. mainCols[TRIGGER_NAME].pFunctionData = NULL;
  1312. StringCopy(mainCols[TASK].szColumn,COL_TASK,
  1313. SIZE_OF_ARRAY(mainCols[TASK].szColumn));
  1314. mainCols[TASK].dwWidth = m_lTaskColWidth;
  1315. mainCols[TASK].dwFlags = SR_TYPE_STRING;
  1316. StringCopy(mainCols[TASK].szFormat,L"%s",
  1317. SIZE_OF_ARRAY(mainCols[TASK].szFormat));
  1318. mainCols[TASK].pFunction = NULL;
  1319. mainCols[TASK].pFunctionData = NULL;
  1320. StringCopy(mainCols[EVENT_QUERY].szColumn,COL_EVENT_QUERY,
  1321. SIZE_OF_ARRAY(mainCols[EVENT_QUERY].szColumn));
  1322. mainCols[EVENT_QUERY].dwWidth = m_lQueryColWidth;
  1323. if(TRUE == m_bVerbose)
  1324. {
  1325. mainCols[EVENT_QUERY].dwFlags = SR_TYPE_STRING;
  1326. }
  1327. else
  1328. {
  1329. mainCols[EVENT_QUERY].dwFlags = SR_HIDECOLUMN|SR_TYPE_STRING;
  1330. }
  1331. StringCopy(mainCols[EVENT_QUERY].szFormat,L"%s",
  1332. SIZE_OF_ARRAY(mainCols[EVENT_QUERY].szFormat));
  1333. mainCols[EVENT_QUERY].pFunction = NULL;
  1334. mainCols[EVENT_QUERY].pFunctionData = NULL;
  1335. StringCopy(mainCols[EVENT_DESCRIPTION].szColumn,COL_DESCRIPTION,
  1336. SIZE_OF_ARRAY(mainCols[EVENT_DESCRIPTION].szColumn));
  1337. mainCols[EVENT_DESCRIPTION].dwWidth = m_lDescriptionColWidth;
  1338. if( TRUE == m_bVerbose )
  1339. {
  1340. mainCols[EVENT_DESCRIPTION].dwFlags = SR_TYPE_STRING;
  1341. }
  1342. else
  1343. {
  1344. mainCols[EVENT_DESCRIPTION].dwFlags = SR_HIDECOLUMN|SR_TYPE_STRING;
  1345. }
  1346. // Task Username
  1347. StringCopy(mainCols[TASK_USERNAME].szFormat,L"%s",
  1348. SIZE_OF_ARRAY(mainCols[TASK_USERNAME].szFormat));
  1349. mainCols[TASK_USERNAME].pFunction = NULL;
  1350. mainCols[TASK_USERNAME].pFunctionData = NULL;
  1351. StringCopy(mainCols[TASK_USERNAME].szColumn,COL_TASK_USERNAME,
  1352. SIZE_OF_ARRAY(mainCols[TASK_USERNAME].szColumn));
  1353. mainCols[TASK_USERNAME].dwWidth = m_lTaskUserName;
  1354. if( TRUE == m_bVerbose)
  1355. {
  1356. mainCols[TASK_USERNAME].dwFlags = SR_TYPE_STRING;
  1357. }
  1358. else
  1359. {
  1360. mainCols[TASK_USERNAME].dwFlags = SR_HIDECOLUMN|SR_TYPE_STRING;
  1361. }
  1362. StringCopy(mainCols[TASK_USERNAME].szFormat,L"%s",
  1363. SIZE_OF_ARRAY(mainCols[TASK_USERNAME].szFormat));
  1364. mainCols[TASK_USERNAME].pFunction = NULL;
  1365. mainCols[TASK_USERNAME].pFunctionData = NULL;
  1366. DEBUG_INFO;
  1367. }
  1368. LONG
  1369. CETQuery::FindAndReplace(
  1370. IN OUT LPTSTR lpszSource,
  1371. IN LPCTSTR lpszFind,
  1372. IN LPCTSTR lpszReplace
  1373. )
  1374. /*++
  1375. Routine Description:
  1376. This function Will Find a string (lpszFind) in source string (lpszSource)
  1377. and replace it with replace string (lpszReplace) for all occurences.
  1378. It assumes the input 'lpszSource' is big enough to accomodate replace
  1379. value.
  1380. Arguments:
  1381. [in/out] lpszSource : String on which Find-Replace operation to be
  1382. performed
  1383. [in] lpszFind : String to be find
  1384. [in] lpszReplace : String to be replaced.
  1385. Return Value:
  1386. 0 - if Unsucessful
  1387. else returns length of lpszSource.
  1388. --*/
  1389. {
  1390. DEBUG_INFO;
  1391. LONG lSourceLen = StringLength(lpszFind,0);
  1392. LONG lReplacementLen = StringLength(lpszReplace,0);
  1393. LONG lMainLength = StringLength(lpszSource,0);
  1394. LPTSTR pszMainSafe= new TCHAR[StringLength(lpszSource,0)+1];
  1395. LONG nCount = 0;
  1396. LPTSTR lpszStart = NULL;
  1397. lpszStart = lpszSource;
  1398. LPTSTR lpszEnd = NULL;
  1399. lpszEnd = lpszStart + lMainLength;
  1400. LPTSTR lpszTarget=NULL;
  1401. if ((0 == lSourceLen)||( NULL == pszMainSafe))
  1402. {
  1403. RELEASE_MEMORY_EX(pszMainSafe);
  1404. return 0;
  1405. }
  1406. while (lpszStart < lpszEnd)
  1407. {
  1408. while ( NULL != (lpszTarget = (LPWSTR)FindString(lpszStart, lpszFind,0)))
  1409. {
  1410. nCount++;
  1411. lpszStart = lpszTarget + lSourceLen;
  1412. }
  1413. lpszStart += StringLength(lpszStart,0) + 1;
  1414. }
  1415. // if any changes were made, make them
  1416. if (nCount > 0)
  1417. {
  1418. StringCopy(pszMainSafe,lpszSource,SIZE_OF_NEW_ARRAY(pszMainSafe));
  1419. LONG lOldLength = lMainLength;
  1420. // else, we just do it in-place
  1421. lpszStart= lpszSource;
  1422. lpszEnd = lpszStart +StringLength(lpszSource,0);
  1423. // loop again to actually do the work
  1424. while (lpszStart < lpszEnd)
  1425. {
  1426. while ( NULL != (lpszTarget = (LPWSTR)FindString(lpszStart, lpszFind,0)))
  1427. {
  1428. #ifdef _WIN64
  1429. __int64 lBalance ;
  1430. #else
  1431. LONG lBalance;
  1432. #endif
  1433. lBalance = lOldLength - (lpszTarget - lpszStart + lSourceLen);
  1434. memmove(lpszTarget + lReplacementLen, lpszTarget + lSourceLen,
  1435. (size_t) lBalance * sizeof(TCHAR));
  1436. memcpy(lpszTarget, lpszReplace, lReplacementLen*sizeof(TCHAR));
  1437. lpszStart = lpszTarget + lReplacementLen;
  1438. lpszStart[lBalance] = L'\0';
  1439. lOldLength += (lReplacementLen - lSourceLen);
  1440. }
  1441. lpszStart += StringLength(lpszStart,0) + 1;
  1442. }
  1443. }
  1444. RELEASE_MEMORY_EX(pszMainSafe);
  1445. DEBUG_INFO;
  1446. return StringLength(lpszSource,0);
  1447. }
  1448. void
  1449. CETQuery::CalcColWidth(
  1450. IN LONG lOldLength,
  1451. OUT LONG *plNewLength,
  1452. IN LPTSTR pszString)
  1453. /*++
  1454. Routine Description:
  1455. Calculates the width required for column
  1456. Arguments:
  1457. [in] lOldLength : Previous length
  1458. [out] plNewLength : New Length
  1459. [in] pszString : String .
  1460. Return Value:
  1461. none
  1462. --*/
  1463. {
  1464. LONG lStrLength = StringLength(pszString,0)+2;
  1465. //Any way column width should not be greater than MAX_COL_LENGTH
  1466. // Stores the maximum of WQL length.
  1467. if(lStrLength > lOldLength)
  1468. {
  1469. *plNewLength = lStrLength;
  1470. }
  1471. else
  1472. {
  1473. *plNewLength = lOldLength;
  1474. }
  1475. }
  1476. HRESULT
  1477. CETQuery::GetRunAsUserName(
  1478. IN LPCWSTR pszScheduleTaskName,
  1479. IN BOOL bXPorNET
  1480. )
  1481. /*++
  1482. Routine Description:
  1483. Get User Name from Task Scheduler
  1484. Arguments:
  1485. [in] pszScheduleTaskName : Task Name
  1486. [in] bXPorNET : TRUE if remote machine is XP else .NET.
  1487. Return Value:
  1488. HRESULT
  1489. --*/
  1490. {
  1491. // if pszSheduleTaskName is null or 0 length just return N/A.
  1492. HRESULT hr = S_OK;
  1493. BSTR bstrTemp = NULL;
  1494. VARIANT vVariant;
  1495. DEBUG_INFO;
  1496. if(0 == StringLength(pszScheduleTaskName,0))
  1497. {
  1498. StringCopy(m_szTaskUserName,DEFAULT_USER,SIZE_OF_ARRAY(m_szTaskUserName));
  1499. return S_OK;
  1500. }
  1501. StringCopy(m_szTaskUserName,GetResString(IDS_ID_NA),SIZE_OF_ARRAY(m_szTaskUserName));
  1502. // Put input parameter for QueryETrigger method
  1503. hr = PropertyPut(m_pInInst,FPR_TASK_SCHEDULER,_bstr_t(pszScheduleTaskName));
  1504. ON_ERROR_THROW_EXCEPTION(hr);
  1505. // All The required properties sets, so
  1506. // executes DeleteETrigger method to delete eventtrigger
  1507. DEBUG_INFO;
  1508. if( TRUE == bXPorNET )
  1509. {
  1510. hr = m_pWbemServices->ExecMethod(_bstr_t(CLS_TRIGGER_EVENT_CONSUMER),
  1511. _bstr_t(FN_QUERY_ETRIGGER_XP),
  1512. 0, NULL, m_pInInst,&m_pOutInst,NULL);
  1513. }
  1514. else
  1515. {
  1516. hr = m_pWbemServices->ExecMethod(_bstr_t(CLS_TRIGGER_EVENT_CONSUMER),
  1517. _bstr_t(FN_QUERY_ETRIGGER),
  1518. 0, NULL, m_pInInst,&m_pOutInst,NULL);
  1519. }
  1520. ON_ERROR_THROW_EXCEPTION(hr);
  1521. DEBUG_INFO;
  1522. VARIANT vtValue;
  1523. // initialize the variant and then get the value of the specified property
  1524. VariantInit( &vtValue );
  1525. hr = m_pOutInst->Get( _bstr_t( FPR_RETURN_VALUE ), 0, &vtValue, NULL, NULL );
  1526. ON_ERROR_THROW_EXCEPTION( hr );
  1527. //Get Output paramters.
  1528. hr = vtValue.lVal;
  1529. // Clear the variant variable
  1530. VariantClear( &vtValue );
  1531. if (FAILED(hr))
  1532. {
  1533. if (!((ERROR_INVALID_USER == hr) || (ERROR_RUN_AS_USER == hr) ||
  1534. (SCHEDULER_NOT_RUNNING_ERROR_CODE == hr) ||
  1535. (RPC_SERVER_NOT_AVAILABLE == hr) ||
  1536. (ERROR_TRIGGER_NOT_FOUND == hr) ||
  1537. (ERROR_TRIGGER_CORRUPTED) == hr))
  1538. {
  1539. ON_ERROR_THROW_EXCEPTION(hr);
  1540. }
  1541. if( ERROR_INVALID_USER == hr || ERROR_TRIGGER_NOT_FOUND == hr)
  1542. {
  1543. // means user doesnot has enough rights to
  1544. // see schtask associated to it.
  1545. DEBUG_INFO;
  1546. return E_FAIL;
  1547. }
  1548. else if((ERROR_RUN_AS_USER == hr) || (SCHEDULER_NOT_RUNNING_ERROR_CODE == hr) ||
  1549. (RPC_SERVER_NOT_AVAILABLE == hr))
  1550. {
  1551. // This means task scheduler not running, or run as user was set with
  1552. // non existing user so while retriving it will throw error.
  1553. DEBUG_INFO;
  1554. StringCopy(m_szTaskUserName,GetResString(IDS_RUNAS_USER_UNKNOWN),
  1555. SIZE_OF_ARRAY(m_szTaskUserName));
  1556. return S_OK;
  1557. }
  1558. else if (ERROR_TRIGGER_CORRUPTED == hr)
  1559. {
  1560. return hr;
  1561. }
  1562. }
  1563. bstrTemp = SysAllocString(FPR_RUN_AS_USER);
  1564. VariantInit(&vVariant);
  1565. hr = m_pOutInst->Get(bstrTemp, 0, &vVariant, 0, 0);
  1566. SAFE_RELEASE_BSTR(bstrTemp);
  1567. ON_ERROR_THROW_EXCEPTION(hr);
  1568. StringCopy(m_szTaskUserName,vVariant.bstrVal,SIZE_OF_ARRAY(m_szTaskUserName));
  1569. hr = VariantClear(&vVariant);
  1570. ON_ERROR_THROW_EXCEPTION(hr);
  1571. if( 0 == StringLength(m_szTaskUserName,0))
  1572. {
  1573. StringCopy(m_szTaskUserName,GetResString(IDS_ID_NA),SIZE_OF_ARRAY(m_szTaskUserName));
  1574. }
  1575. DEBUG_INFO;
  1576. return S_OK;
  1577. }
  1578. BOOL
  1579. CETQuery::GetNValidateTriggerId(
  1580. IN OUT DWORD *dwLower,
  1581. IN OUT DWORD *dwUpper
  1582. )
  1583. /*++
  1584. Routine Description:
  1585. Get and validate TriggerId
  1586. Arguments:
  1587. [in/out] dwLower : Trigger id Lower bound.
  1588. [in/out] dwUpper : Trigger id Upper bound.
  1589. Return Value:
  1590. BOOL
  1591. --*/
  1592. {
  1593. // temp variables
  1594. CHString szTempId = m_pszTriggerID;
  1595. CHString szLowerBound = L"";
  1596. CHString szUpperBound = L"";
  1597. LPTSTR pszStopString = NULL;
  1598. BOOL bReturn = TRUE;
  1599. DEBUG_INFO;
  1600. // Find whether it is a range
  1601. DWORD dwIndex = szTempId.Find( '-' );
  1602. // check if it is a range
  1603. if( -1 == dwIndex)
  1604. {
  1605. // Check for numeric
  1606. bReturn = IsNumeric( szTempId, 10, FALSE );
  1607. if( FALSE == bReturn)
  1608. {
  1609. SetReason( GetResString(IDS_INVALID_ID) );
  1610. return FALSE;
  1611. }
  1612. // set the upper bound and lower bound to given value
  1613. *dwLower = wcstol( szTempId, &pszStopString, 10 );
  1614. *dwUpper = wcstol( szTempId, &pszStopString, 10 );
  1615. }
  1616. // if it is a range
  1617. else
  1618. {
  1619. // get and set the upper bound and lower bound
  1620. DWORD dwLength = szTempId.GetLength();
  1621. szLowerBound = szTempId.Left( dwIndex );
  1622. szLowerBound.TrimLeft();
  1623. szLowerBound.TrimRight();
  1624. if( ( szLowerBound.GetLength() < 0 ) ||
  1625. ( FALSE == IsNumeric( szLowerBound, 10, FALSE )))
  1626. {
  1627. SetReason( GetResString(IDS_INVALID_RANGE) );
  1628. return FALSE;
  1629. }
  1630. szUpperBound = szTempId.Right( dwLength - ( dwIndex + 1) );
  1631. szUpperBound.TrimLeft();
  1632. szUpperBound.TrimRight();
  1633. if( ( szUpperBound.GetLength() < 0 ) ||
  1634. ( FALSE == IsNumeric( szUpperBound, 10, FALSE )))
  1635. {
  1636. SetReason( GetResString(IDS_INVALID_RANGE) );
  1637. return FALSE;
  1638. }
  1639. *dwLower = wcstol( szLowerBound, &pszStopString, 10 );
  1640. *dwUpper = wcstol( szUpperBound, &pszStopString, 10 );
  1641. if ( *dwLower >= *dwUpper )
  1642. {
  1643. return FALSE;
  1644. }
  1645. }
  1646. DEBUG_INFO;
  1647. return TRUE;
  1648. }
  1649. BOOL
  1650. CETQuery::IsSchSvrcRunning()
  1651. /*++
  1652. Routine Description:
  1653. This function returns whether schedule task services are
  1654. started or not.
  1655. Arguments:
  1656. [in/out] dwLower : Trigger id Lower bound.
  1657. [in/out] dwUpper : Trigger id Upper bound.
  1658. Return Value:
  1659. BOOL: TRUE - Service is started.
  1660. FALSE- otherwise
  1661. --*/
  1662. {
  1663. HRESULT hr = S_OK;
  1664. IEnumWbemClassObject *pEnum = NULL;
  1665. ULONG uReturned = 0;
  1666. VARIANT vVariant;
  1667. DEBUG_INFO;
  1668. BOOL bRetValue = FALSE;
  1669. hr = m_pWbemServices->ExecQuery(_bstr_t(QUERY_LANGUAGE),
  1670. _bstr_t(QUERY_SCHEDULER_STATUS),
  1671. WBEM_FLAG_RETURN_IMMEDIATELY, NULL,
  1672. &pEnum);
  1673. ON_ERROR_THROW_EXCEPTION(hr);
  1674. DEBUG_INFO;
  1675. hr = SetInterfaceSecurity( pEnum, m_pAuthIdentity );
  1676. if(FAILED(hr))
  1677. {
  1678. WMISaveError(hr);
  1679. SAFE_RELEASE_INTERFACE(pEnum);
  1680. _com_issue_error(hr);
  1681. }
  1682. DEBUG_INFO;
  1683. pEnum->Next(WBEM_INFINITE,1,&m_pObj,&uReturned);
  1684. if(FAILED(hr))
  1685. {
  1686. WMISaveError(hr);
  1687. SAFE_RELEASE_INTERFACE(pEnum);
  1688. _com_issue_error(hr);
  1689. }
  1690. DEBUG_INFO;
  1691. if( 0 == uReturned)
  1692. {
  1693. DEBUG_INFO;
  1694. SAFE_RELEASE_INTERFACE(m_pObj);
  1695. SAFE_RELEASE_INTERFACE(pEnum);
  1696. return FALSE;
  1697. }
  1698. DEBUG_INFO;
  1699. VariantInit(&vVariant);
  1700. hr = m_pObj->Get(_bstr_t(STATUS_PROPERTY),0, &vVariant, 0, 0);
  1701. SAFE_RELEASE_INTERFACE(m_pObj);
  1702. SAFE_RELEASE_INTERFACE(pEnum);
  1703. ON_ERROR_THROW_EXCEPTION(hr);
  1704. if(VARIANT_TRUE == vVariant.boolVal)
  1705. {
  1706. DEBUG_INFO;
  1707. bRetValue = TRUE;
  1708. }
  1709. DEBUG_INFO;
  1710. VariantClear(&vVariant);
  1711. return bRetValue;
  1712. }
  1713. /******************************************************************************
  1714. Routine Description:
  1715. This function sets the ITaskScheduler Interface.It also connects to
  1716. the remote machine if specified & helps to operate
  1717. ITaskScheduler on the specified target m/c.
  1718. Arguments:
  1719. none
  1720. Return Value :
  1721. BOOL TRUE: If it successfully sets ITaskScheduler Interface
  1722. FALSE: Otherwise.
  1723. ******************************************************************************/
  1724. BOOL
  1725. CETQuery::SetTaskScheduler()
  1726. {
  1727. HRESULT hr = S_OK;
  1728. LPWSTR wszComputerName = NULL;
  1729. WCHAR wszActualComputerName[ 2 * MAX_STRING_LENGTH ] = DOMAIN_U_STRING;
  1730. wchar_t* pwsz = L"";
  1731. WORD wSlashCount = 0 ;
  1732. DEBUG_INFO;
  1733. hr = CoCreateInstance( CLSID_CTaskScheduler, NULL, CLSCTX_ALL,
  1734. IID_ITaskScheduler,(LPVOID*) &m_pITaskScheduler);
  1735. DEBUG_INFO;
  1736. if( FAILED(hr))
  1737. {
  1738. DEBUG_INFO;
  1739. SetLastError ((DWORD) hr);
  1740. ShowLastErrorEx ( stderr, SLE_TYPE_ERROR | SLE_SYSTEM );
  1741. return FALSE;
  1742. }
  1743. DEBUG_INFO;
  1744. //If the operation is on remote machine
  1745. if( m_bLocalSystem == FALSE )
  1746. {
  1747. DEBUG_INFO;
  1748. wszComputerName = (LPWSTR)m_pszServerName;
  1749. //check whether the server name prefixed with \\ or not.
  1750. if( wszComputerName != NULL )
  1751. {
  1752. pwsz = wszComputerName;
  1753. while ( ( *pwsz != NULL_U_CHAR ) && ( *pwsz == BACK_SLASH_U ) )
  1754. {
  1755. // server name prefixed with '\'..
  1756. // so..increment the pointer and count number of black slashes..
  1757. pwsz = _wcsinc(pwsz);
  1758. wSlashCount++;
  1759. }
  1760. if( (wSlashCount == 2 ) ) // two back slashes are present
  1761. {
  1762. StringCopy( wszActualComputerName, wszComputerName, SIZE_OF_ARRAY(wszActualComputerName) );
  1763. }
  1764. else if ( wSlashCount == 0 )
  1765. {
  1766. //Append "\\" to computer name
  1767. StringConcat(wszActualComputerName, wszComputerName, 2 * MAX_RES_STRING);
  1768. }
  1769. }
  1770. hr = m_pITaskScheduler->SetTargetComputer( wszActualComputerName );
  1771. }
  1772. else
  1773. {
  1774. DEBUG_INFO;
  1775. //Local Machine
  1776. hr = m_pITaskScheduler->SetTargetComputer( NULL );
  1777. }
  1778. if( FAILED( hr ) )
  1779. {
  1780. SetLastError ((DWORD) hr);
  1781. ShowLastErrorEx ( stderr, SLE_TYPE_ERROR | SLE_SYSTEM );
  1782. return FALSE;
  1783. }
  1784. DEBUG_INFO;
  1785. return TRUE;
  1786. }
  1787. /******************************************************************************
  1788. Routine Description:
  1789. This function returns the path of the scheduled task application
  1790. Arguments:
  1791. none
  1792. Return Value:
  1793. A HRESULT value indicating S_OK on success else S_FALSE on failure
  1794. ******************************************************************************/
  1795. HRESULT
  1796. CETQuery::GetApplicationToRun( void)
  1797. {
  1798. ITask *pITask = NULL;
  1799. LPWSTR lpwszApplicationName = NULL;
  1800. LPWSTR lpwszParameters = NULL;
  1801. WCHAR szAppName[MAX_STRING_LENGTH] = L"\0";
  1802. WCHAR szParams[MAX_STRING_LENGTH] = L"\0";
  1803. HRESULT hr = S_OK;
  1804. hr = m_pITaskScheduler->Activate(m_szScheduleTaskName,
  1805. IID_ITask,
  1806. (IUnknown**) &pITask);
  1807. if (FAILED(hr))
  1808. {
  1809. SAFE_RELEASE_INTERFACE(pITask);
  1810. return hr;
  1811. }
  1812. // get the entire path of application name
  1813. hr = pITask->GetApplicationName(&lpwszApplicationName);
  1814. if (FAILED(hr))
  1815. {
  1816. CoTaskMemFree(lpwszApplicationName);
  1817. SAFE_RELEASE_INTERFACE(pITask);
  1818. return hr;
  1819. }
  1820. // get the parameters
  1821. hr = pITask->GetParameters(&lpwszParameters);
  1822. SAFE_RELEASE_INTERFACE(pITask);
  1823. if (FAILED(hr))
  1824. {
  1825. CoTaskMemFree(lpwszApplicationName);
  1826. CoTaskMemFree(lpwszParameters);
  1827. return hr;
  1828. }
  1829. StringCopy( szAppName, lpwszApplicationName, SIZE_OF_ARRAY(szAppName));
  1830. StringCopy(szParams, lpwszParameters, SIZE_OF_ARRAY(szParams));
  1831. if(StringLength(szAppName, 0) == 0)
  1832. {
  1833. StringCopy(m_szTask, L"\0", MAX_STRING_LENGTH);
  1834. }
  1835. else
  1836. {
  1837. StringConcat( szAppName, _T(" "), SIZE_OF_ARRAY(szAppName) );
  1838. StringConcat( szAppName, szParams, SIZE_OF_ARRAY(szAppName) );
  1839. StringCopy( m_szTask, szAppName, MAX_STRING_LENGTH);
  1840. }
  1841. CoTaskMemFree(lpwszApplicationName);
  1842. CoTaskMemFree(lpwszParameters);
  1843. return S_OK;
  1844. }
  1845. BOOL
  1846. CETQuery::DisplayXPResults(
  1847. void
  1848. )
  1849. /*++
  1850. Routine Description:
  1851. This function displays all the triggers present on a remote XP machine.
  1852. This function is for compatibility of .NET ot XP machine only.
  1853. Arguments:
  1854. NONE
  1855. Return Value:
  1856. BOOL: TRUE - If succedded in displaying results.
  1857. FALSE- otherwise
  1858. --*/
  1859. {
  1860. HRESULT hr = S_OK;
  1861. VARIANT vVariant;
  1862. BOOL bAlwaysTrue = TRUE;
  1863. DWORD dwEventId = 0;
  1864. LONG lTemp = 0;
  1865. DWORD dwFormatType = SR_FORMAT_TABLE;
  1866. // store Row number.
  1867. DWORD dwRowCount = 0;
  1868. BOOL bAtLeastOneEvent = FALSE;
  1869. BSTR bstrConsumer = NULL;
  1870. BSTR bstrFilter = NULL;
  1871. TCHAR szHostName[MAX_STRING_LENGTH+1];
  1872. TCHAR szEventTriggerName[MAX_TRIGGER_NAME];
  1873. IEnumWbemClassObject *pEnumCmdTriggerConsumer = NULL;
  1874. IEnumWbemClassObject *pEnumFilterToConsumerBinding = NULL;
  1875. VariantInit( &vVariant );
  1876. try
  1877. {
  1878. // if -id switch is specified
  1879. if( (1 == cmdOptions[ ID_Q_TRIGGERID ].dwActuals) &&
  1880. (StringLength( m_pszTriggerID,0) > 0 ))
  1881. {
  1882. TCHAR szTemp[ MAX_STRING_LENGTH ];
  1883. SecureZeroMemory(szTemp, MAX_STRING_LENGTH);
  1884. StringCchPrintfW( szTemp,SIZE_OF_ARRAY(szTemp), QUERY_RANGE,
  1885. m_dwLowerBound, m_dwUpperBound );
  1886. DEBUG_INFO;
  1887. hr = m_pWbemServices->ExecQuery( _bstr_t( QUERY_LANGUAGE), _bstr_t(szTemp),
  1888. WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL,
  1889. &pEnumCmdTriggerConsumer );
  1890. ON_ERROR_THROW_EXCEPTION(hr);
  1891. DEBUG_INFO;
  1892. hr = SetInterfaceSecurity( pEnumCmdTriggerConsumer,
  1893. m_pAuthIdentity );
  1894. ON_ERROR_THROW_EXCEPTION(hr);
  1895. DEBUG_INFO;
  1896. // retrieves CmdTriggerConsumer class
  1897. DEBUG_INFO;
  1898. hr = m_pWbemServices->GetObject(_bstr_t( CLS_TRIGGER_EVENT_CONSUMER ),
  1899. 0, NULL, &m_pClass, NULL);
  1900. ON_ERROR_THROW_EXCEPTION(hr);
  1901. DEBUG_INFO;
  1902. // Gets information about the "QueryETrigger( " method of
  1903. // "cmdTriggerConsumer" class
  1904. hr = m_pClass->GetMethod(_bstr_t( FN_QUERY_ETRIGGER_XP ),
  1905. 0, &m_pInClass, NULL);
  1906. ON_ERROR_THROW_EXCEPTION(hr);
  1907. DEBUG_INFO;
  1908. // create a new instance of a class "TriggerEventConsumer ".
  1909. hr = m_pInClass->SpawnInstance(0, &m_pInInst);
  1910. ON_ERROR_THROW_EXCEPTION(hr);
  1911. hr = SetInterfaceSecurity( pEnumCmdTriggerConsumer,
  1912. m_pAuthIdentity );
  1913. ON_ERROR_THROW_EXCEPTION(hr);
  1914. DEBUG_INFO;
  1915. while( bAlwaysTrue )
  1916. {
  1917. ULONG uReturned = 0;
  1918. BSTR bstrTemp = NULL;
  1919. CHString strTemp;
  1920. DEBUG_INFO;
  1921. // Get one object starting at the current position in an
  1922. //enumeration
  1923. SAFE_RELEASE_INTERFACE(m_pObj);
  1924. hr = pEnumCmdTriggerConsumer->Next(WBEM_INFINITE,
  1925. 1,&m_pObj,&uReturned);
  1926. ON_ERROR_THROW_EXCEPTION(hr);
  1927. DEBUG_INFO;
  1928. if( 0 == uReturned)
  1929. {
  1930. SAFE_RELEASE_INTERFACE(m_pObj);
  1931. break;
  1932. }
  1933. hr = m_pObj->Get(_bstr_t( FPR_TRIGGER_ID ),
  1934. 0, &vVariant, 0, 0);
  1935. if(FAILED(hr))
  1936. {
  1937. SAFE_RELEASE_INTERFACE(m_pObj);
  1938. if( WBEM_E_NOT_FOUND == hr)
  1939. {
  1940. continue;
  1941. }
  1942. ON_ERROR_THROW_EXCEPTION(hr);
  1943. }
  1944. DEBUG_INFO;
  1945. if( ( VT_EMPTY != V_VT( &vVariant ) ) &&
  1946. ( VT_NULL != V_VT( &vVariant ) ) )
  1947. {
  1948. dwEventId = ( DWORD ) vVariant.lVal ;
  1949. }
  1950. else
  1951. {
  1952. dwEventId = 0 ;
  1953. }
  1954. VariantClear(&vVariant);
  1955. // Retrieves the "Trigger Name" information
  1956. hr = m_pObj->Get(_bstr_t( FPR_TRIGGER_NAME ), 0, &vVariant, 0, 0);
  1957. ON_ERROR_THROW_EXCEPTION(hr);
  1958. if( VT_BSTR == V_VT( &vVariant ) )
  1959. {
  1960. StringCopy(szEventTriggerName, ( LPTSTR )_bstr_t( vVariant ), MAX_RES_STRING);
  1961. }
  1962. else
  1963. {
  1964. StringCopy(szEventTriggerName, GetResString( IDS_ID_NA ), MAX_RES_STRING);
  1965. }
  1966. VariantClear(&vVariant);
  1967. // Retrieves the "Trigger Description" information
  1968. hr = m_pObj->Get(_bstr_t( FPR_TRIGGER_DESC ), 0, &vVariant, 0, 0);
  1969. ON_ERROR_THROW_EXCEPTION(hr);
  1970. if( VT_BSTR == V_VT( &vVariant ) )
  1971. {
  1972. StringCopy(m_szBuffer,( LPTSTR )_bstr_t( vVariant ),
  1973. SIZE_OF_ARRAY(m_szBuffer));
  1974. }
  1975. else
  1976. {
  1977. StringCopy(m_szBuffer, GetResString( IDS_ID_NA ),
  1978. SIZE_OF_ARRAY(m_szBuffer));
  1979. }
  1980. lTemp = StringLength(m_szBuffer,0);
  1981. DEBUG_INFO;
  1982. StringCopy(m_szEventDesc,m_szBuffer,
  1983. SIZE_OF_ARRAY(m_szEventDesc));
  1984. VariantClear(&vVariant);
  1985. DEBUG_INFO;
  1986. // Retrieves the "Host Name" information
  1987. hr = m_pObj->Get(_bstr_t( L"__SERVER" ), 0, &vVariant, 0, 0);
  1988. ON_ERROR_THROW_EXCEPTION(hr);
  1989. if( VT_BSTR == V_VT( &vVariant ) )
  1990. {
  1991. StringCopy(szHostName,( LPTSTR )_bstr_t( vVariant ),SIZE_OF_ARRAY(szHostName));
  1992. }
  1993. else
  1994. {
  1995. StringCopy(szHostName, GetResString( IDS_ID_NA ), SIZE_OF_ARRAY(szHostName));
  1996. }
  1997. VariantClear(&vVariant);
  1998. DEBUG_INFO;
  1999. // Retrieves the "RunAs User" information
  2000. hr = m_pObj->Get(_bstr_t( FPR_TASK_SCHEDULER ), 0, &vVariant, 0, 0);
  2001. ON_ERROR_THROW_EXCEPTION(hr);
  2002. DEBUG_INFO;
  2003. GetRunAsUserName((LPCWSTR)_bstr_t(vVariant.bstrVal), TRUE);
  2004. StringCopy(m_szScheduleTaskName,(LPCWSTR)_bstr_t(vVariant),
  2005. SIZE_OF_ARRAY(m_szScheduleTaskName));
  2006. VariantClear(&vVariant);
  2007. //retrieves the 'Action' value if exits
  2008. hr = m_pObj->Get( _bstr_t( L"Action" ), 0, &vVariant, 0, 0);
  2009. ON_ERROR_THROW_EXCEPTION(hr);
  2010. StringCopy(m_szBuffer,(LPWSTR)_bstr_t(vVariant),
  2011. SIZE_OF_ARRAY(m_szBuffer));
  2012. lTemp = StringLength(m_szBuffer,0);
  2013. StringCopy(m_szTask, m_szBuffer, SIZE_OF_ARRAY(m_szTask));
  2014. VariantClear(&vVariant);
  2015. StringCopy(szTemp,L"",SIZE_OF_ARRAY(szTemp));
  2016. StringCchPrintfW( szTemp, SIZE_OF_ARRAY(szTemp),
  2017. BINDING_CLASS_QUERY, dwEventId);
  2018. DEBUG_INFO;
  2019. hr = m_pWbemServices->ExecQuery( _bstr_t(QUERY_LANGUAGE),
  2020. _bstr_t(szTemp),
  2021. WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
  2022. NULL,
  2023. &pEnumFilterToConsumerBinding);
  2024. ON_ERROR_THROW_EXCEPTION(hr);
  2025. DEBUG_INFO;
  2026. hr = SetInterfaceSecurity( pEnumFilterToConsumerBinding,
  2027. m_pAuthIdentity );
  2028. ON_ERROR_THROW_EXCEPTION(hr);
  2029. DEBUG_INFO;
  2030. // Get one object starting at the current position in an
  2031. //enumeration
  2032. SAFE_RELEASE_INTERFACE(m_pClass);
  2033. hr = pEnumFilterToConsumerBinding->Next(WBEM_INFINITE,
  2034. 1,&m_pClass,&uReturned);
  2035. ON_ERROR_THROW_EXCEPTION(hr);
  2036. DEBUG_INFO;
  2037. if( 0 == uReturned )
  2038. {
  2039. SAFE_RELEASE_INTERFACE(pEnumFilterToConsumerBinding);
  2040. SAFE_RELEASE_INTERFACE(m_pObj);
  2041. SAFE_RELEASE_INTERFACE(m_pTriggerEventConsumer);
  2042. SAFE_RELEASE_INTERFACE(m_pEventFilter);
  2043. continue;
  2044. }
  2045. DEBUG_INFO;
  2046. hr = m_pClass->Get(_bstr_t( L"Filter" ), 0, &vVariant, 0, 0);
  2047. ON_ERROR_THROW_EXCEPTION(hr);
  2048. DEBUG_INFO;
  2049. hr = m_pWbemServices->GetObject( _bstr_t( vVariant ),
  2050. 0,
  2051. NULL,
  2052. &m_pEventFilter,
  2053. NULL);
  2054. VariantClear(&vVariant);
  2055. DEBUG_INFO;
  2056. if(FAILED(hr))
  2057. {
  2058. if( WBEM_E_NOT_FOUND == hr)
  2059. {
  2060. SAFE_RELEASE_INTERFACE(pEnumFilterToConsumerBinding);
  2061. continue;
  2062. }
  2063. ON_ERROR_THROW_EXCEPTION(hr);
  2064. }
  2065. DEBUG_INFO;
  2066. hr = m_pEventFilter->Get(_bstr_t( L"Query" ), 0, &vVariant, 0, 0);
  2067. ON_ERROR_THROW_EXCEPTION(hr);
  2068. StringCopy(m_szBuffer,(LPWSTR)_bstr_t(vVariant),
  2069. SIZE_OF_ARRAY(m_szBuffer));
  2070. VariantClear(&vVariant);
  2071. DEBUG_INFO;
  2072. FindAndReplace(m_szBuffer,QUERY_STRING_AND,SHOW_WQL_QUERY);
  2073. FindAndReplace(m_szBuffer,L"targetinstance.LogFile",L"Log");
  2074. FindAndReplace(m_szBuffer,L"targetinstance.Type",L"Type");
  2075. FindAndReplace(m_szBuffer,L"targetinstance.EventCode",L"Id");
  2076. FindAndReplace(m_szBuffer,
  2077. L"targetinstance.SourceName",L"Source");
  2078. DEBUG_INFO;
  2079. // Remove extra spaces
  2080. FindAndReplace( m_szBuffer,L" ",L" ");
  2081. // Remove extra spaces
  2082. FindAndReplace(m_szBuffer,L" ",L" ");
  2083. lTemp = StringLength(m_szBuffer,0);
  2084. // for the safer size for allocation of memory.
  2085. // allocates memory only if new WQL is greate than previous one.
  2086. lTemp += 4;
  2087. if(lTemp > m_lWQLColWidth)
  2088. {
  2089. DEBUG_INFO;
  2090. // first free it (if previously allocated)
  2091. RELEASE_MEMORY_EX(m_pszEventQuery);
  2092. m_pszEventQuery = new TCHAR[lTemp+1];
  2093. CheckAndSetMemoryAllocation(m_pszEventQuery,lTemp);
  2094. }
  2095. lTemp = m_lWQLColWidth;
  2096. CalcColWidth(lTemp,&m_lWQLColWidth,m_szBuffer);
  2097. // Now manipulate the WQL string to get EventQuery....
  2098. FindAndReplace(m_szBuffer,SHOW_WQL_QUERY,
  2099. GetResString(IDS_EVENTS_WITH));
  2100. //to remove extra spaces
  2101. FindAndReplace(m_szBuffer,L" ",L" ");
  2102. //to remove extra spaces
  2103. FindAndReplace( m_szBuffer,L" ",L" ");
  2104. StringCopy( m_pszEventQuery,m_szBuffer,
  2105. SIZE_OF_NEW_ARRAY(m_pszEventQuery));
  2106. DEBUG_INFO;
  2107. // Now Shows the results on screen
  2108. // Appends for in m_arrColData array
  2109. dwRowCount = DynArrayAppendRow( m_arrColData, NO_OF_COLUMNS );
  2110. // Fills Results in m_arrColData data structure
  2111. DynArraySetString2( m_arrColData, dwRowCount, HOST_NAME,
  2112. szHostName,0);
  2113. DynArraySetDWORD2( m_arrColData , dwRowCount,
  2114. TRIGGER_ID,dwEventId);
  2115. DynArraySetString2( m_arrColData, dwRowCount, TRIGGER_NAME,
  2116. szEventTriggerName,0);
  2117. DynArraySetString2( m_arrColData, dwRowCount, TASK,
  2118. m_szTask,0);
  2119. DynArraySetString2( m_arrColData, dwRowCount, EVENT_QUERY,
  2120. m_pszEventQuery,0);
  2121. DynArraySetString2( m_arrColData, dwRowCount, EVENT_DESCRIPTION,
  2122. m_szEventDesc,0);
  2123. DynArraySetString2( m_arrColData, dwRowCount, TASK_USERNAME,
  2124. m_szTaskUserName,0);
  2125. bAtLeastOneEvent = TRUE;
  2126. // Calculatate new column width for each column
  2127. lTemp = m_lHostNameColWidth;
  2128. CalcColWidth(lTemp,&m_lHostNameColWidth,szHostName);
  2129. lTemp = m_lETNameColWidth;
  2130. CalcColWidth(lTemp,&m_lETNameColWidth,szEventTriggerName);
  2131. lTemp = m_lTaskColWidth;
  2132. CalcColWidth(lTemp,&m_lTaskColWidth,m_szTask);
  2133. lTemp = m_lQueryColWidth;
  2134. CalcColWidth(lTemp,&m_lQueryColWidth,m_pszEventQuery);
  2135. lTemp = m_lDescriptionColWidth;
  2136. CalcColWidth(lTemp,&m_lDescriptionColWidth,m_szEventDesc);
  2137. // Resets current containts..if any
  2138. StringCopy(szHostName, L"",SIZE_OF_ARRAY(szHostName));
  2139. dwEventId = 0;
  2140. StringCopy(szEventTriggerName,L"",SIZE_OF_ARRAY(szEventTriggerName));
  2141. StringCopy( m_szTask, L"",
  2142. SIZE_OF_ARRAY(m_szTask));
  2143. StringCopy(m_pszEventQuery,L"",SIZE_OF_NEW_ARRAY(m_pszEventQuery));
  2144. StringCopy(m_szEventDesc,L"",SIZE_OF_ARRAY(m_szEventDesc));
  2145. SAFE_RELEASE_INTERFACE(m_pObj);
  2146. SAFE_RELEASE_INTERFACE(m_pTriggerEventConsumer);
  2147. SAFE_RELEASE_INTERFACE(m_pEventFilter);
  2148. DEBUG_INFO;
  2149. }
  2150. }
  2151. else
  2152. {
  2153. //Following method will creates an enumerator that returns the
  2154. // instances of a specified __FilterToConsumerBinding class
  2155. hr = m_pWbemServices->
  2156. CreateInstanceEnum(_bstr_t( CLS_FILTER_TO_CONSUMERBINDING ),
  2157. WBEM_FLAG_SHALLOW,
  2158. NULL,
  2159. &pEnumFilterToConsumerBinding);
  2160. ON_ERROR_THROW_EXCEPTION(hr);
  2161. hr = SetInterfaceSecurity( pEnumFilterToConsumerBinding,
  2162. m_pAuthIdentity );
  2163. ON_ERROR_THROW_EXCEPTION(hr);
  2164. // retrieves CmdTriggerConsumer class
  2165. hr = m_pWbemServices->GetObject(_bstr_t( CLS_TRIGGER_EVENT_CONSUMER ),
  2166. 0, NULL, &m_pClass, NULL);
  2167. ON_ERROR_THROW_EXCEPTION(hr);
  2168. // Gets information about the "QueryETrigger( " method of
  2169. // "cmdTriggerConsumer" class
  2170. hr = m_pClass->GetMethod(_bstr_t( FN_QUERY_ETRIGGER_XP ),
  2171. 0, &m_pInClass, NULL);
  2172. ON_ERROR_THROW_EXCEPTION(hr);
  2173. // create a new instance of a class "TriggerEventConsumer ".
  2174. hr = m_pInClass->SpawnInstance(0, &m_pInInst);
  2175. ON_ERROR_THROW_EXCEPTION(hr);
  2176. // set the security at the interface level also
  2177. hr = SetInterfaceSecurity( pEnumFilterToConsumerBinding,
  2178. m_pAuthIdentity );
  2179. ON_ERROR_THROW_EXCEPTION(hr);
  2180. while(1)
  2181. {
  2182. ULONG uReturned = 0; // holds no. of object returns from Next
  2183. //mathod
  2184. BSTR bstrTemp = NULL;
  2185. CHString strTemp;
  2186. // Get one object starting at the current position in an
  2187. //enumeration
  2188. hr = pEnumFilterToConsumerBinding->Next(WBEM_INFINITE,
  2189. 1,&m_pObj,&uReturned);
  2190. ON_ERROR_THROW_EXCEPTION(hr);
  2191. if(uReturned == 0)
  2192. {
  2193. SAFE_RELEASE_INTERFACE(m_pObj);
  2194. break;
  2195. }
  2196. VariantInit(&vVariant);
  2197. SAFE_RELEASE_BSTR(bstrTemp);
  2198. hr = m_pObj->Get(_bstr_t( L"Consumer" ), 0, &vVariant, 0, 0);
  2199. ON_ERROR_THROW_EXCEPTION(hr);
  2200. bstrConsumer =SysAllocString( vVariant.bstrVal);
  2201. hr = VariantClear(&vVariant);
  2202. ON_ERROR_THROW_EXCEPTION(hr);
  2203. // Search for trggereventconsumer string as we are interested to
  2204. // get object from this class only
  2205. strTemp = bstrConsumer;
  2206. if(strTemp.Find(CLS_TRIGGER_EVENT_CONSUMER)==-1)
  2207. continue;
  2208. hr = SetInterfaceSecurity( m_pWbemServices,
  2209. m_pAuthIdentity );
  2210. ON_ERROR_THROW_EXCEPTION(hr);
  2211. hr = m_pWbemServices->GetObject(bstrConsumer,
  2212. 0,
  2213. NULL,
  2214. &m_pTriggerEventConsumer,
  2215. NULL);
  2216. SAFE_RELEASE_BSTR(bstrConsumer);
  2217. if(FAILED(hr))
  2218. {
  2219. if(hr==WBEM_E_NOT_FOUND)
  2220. continue;
  2221. ON_ERROR_THROW_EXCEPTION(hr);
  2222. }
  2223. bstrTemp = SysAllocString(L"Filter");
  2224. hr = m_pObj->Get(bstrTemp, 0, &vVariant, 0, 0);
  2225. SAFE_RELEASE_BSTR(bstrTemp);
  2226. ON_ERROR_THROW_EXCEPTION(hr);
  2227. bstrFilter = SysAllocString(vVariant.bstrVal);
  2228. hr = VariantClear(&vVariant);
  2229. ON_ERROR_THROW_EXCEPTION(hr);
  2230. hr = m_pWbemServices->GetObject(
  2231. bstrFilter,
  2232. 0,
  2233. NULL,
  2234. &m_pEventFilter,
  2235. NULL);
  2236. SAFE_RELEASE_BSTR(bstrFilter);
  2237. if(FAILED(hr))
  2238. {
  2239. if(hr==WBEM_E_NOT_FOUND)
  2240. continue;
  2241. ON_ERROR_THROW_EXCEPTION(hr);
  2242. }
  2243. //retrieves the 'TriggerID' value if exits
  2244. bstrTemp = SysAllocString(FPR_TRIGGER_ID);
  2245. hr = m_pTriggerEventConsumer->Get(bstrTemp,
  2246. 0, &vVariant, 0, 0);
  2247. if(FAILED(hr))
  2248. {
  2249. if(hr==WBEM_E_NOT_FOUND)
  2250. continue;
  2251. ON_ERROR_THROW_EXCEPTION(hr);
  2252. }
  2253. SAFE_RELEASE_BSTR(bstrTemp);
  2254. dwEventId = vVariant.lVal ;
  2255. hr = VariantClear(&vVariant);
  2256. ON_ERROR_THROW_EXCEPTION(hr);
  2257. //retrieves the 'Action' value if exits
  2258. bstrTemp = SysAllocString(L"Action");
  2259. hr = m_pTriggerEventConsumer->Get(bstrTemp, 0, &vVariant, 0, 0);
  2260. ON_ERROR_THROW_EXCEPTION(hr);
  2261. SAFE_RELEASE_BSTR(bstrTemp);
  2262. StringCopy( m_szBuffer, (LPWSTR)_bstr_t(vVariant),
  2263. SIZE_OF_ARRAY( m_szBuffer ));
  2264. lTemp = StringLength( m_szBuffer, 0 );
  2265. lTemp += 4; // for the safer size for allocation of memory.
  2266. // allocates memory only if new task length is greate than previous one.
  2267. if(lTemp > m_lTaskColWidth)
  2268. {
  2269. CheckAndSetMemoryAllocation(m_szTask,lTemp);
  2270. }
  2271. StringCopy(m_szTask,m_szBuffer, SIZE_OF_ARRAY(m_szTask));
  2272. VariantClear(&vVariant);
  2273. //retrieves the 'TriggerDesc' value if exits
  2274. bstrTemp = SysAllocString(FPR_TRIGGER_DESC);
  2275. hr = m_pTriggerEventConsumer->Get(bstrTemp, 0, &vVariant, 0, 0);
  2276. ON_ERROR_THROW_EXCEPTION(hr);
  2277. SAFE_RELEASE_BSTR(bstrTemp);
  2278. StringCopy(m_szBuffer,(_TCHAR*)_bstr_t(vVariant.bstrVal), SIZE_OF_ARRAY( m_szBuffer ));
  2279. lTemp = StringLength(m_szBuffer, 0);
  2280. if(lTemp == 0)// Means description is not available make it N/A.
  2281. {
  2282. StringCopy(m_szBuffer,GetResString(IDS_ID_NA), SIZE_OF_ARRAY( m_szBuffer ));
  2283. lTemp = StringLength(m_szBuffer, 0);
  2284. }
  2285. lTemp += 4; // for the safer size for allocation of memory.
  2286. // allocates memory only if new Description length is greate than
  2287. // previous one.
  2288. if(lTemp > m_lDescriptionColWidth)
  2289. {
  2290. CheckAndSetMemoryAllocation(m_szEventDesc,lTemp);
  2291. }
  2292. StringCopy(m_szEventDesc,m_szBuffer, SIZE_OF_ARRAY( m_szEventDesc ));
  2293. hr = VariantClear(&vVariant);
  2294. ON_ERROR_THROW_EXCEPTION(hr);
  2295. // TriggerName
  2296. //retrieves the 'TriggerName' value if exits
  2297. bstrTemp = SysAllocString(FPR_TRIGGER_NAME);
  2298. hr = m_pTriggerEventConsumer->Get(bstrTemp, 0, &vVariant, 0, 0);
  2299. SAFE_RELEASE_BSTR(bstrTemp);
  2300. ON_ERROR_THROW_EXCEPTION(hr);
  2301. StringCchPrintfW(szEventTriggerName, SIZE_OF_ARRAY(szEventTriggerName),
  2302. _T("%s"), (LPWSTR)_bstr_t( vVariant ));
  2303. hr = VariantClear(&vVariant);
  2304. ON_ERROR_THROW_EXCEPTION(hr);
  2305. // Host Name
  2306. //retrieves the '__SERVER' value if exits
  2307. bstrTemp = SysAllocString(L"__SERVER");
  2308. hr = m_pTriggerEventConsumer->Get(bstrTemp, 0, &vVariant, 0, 0);
  2309. SAFE_RELEASE_BSTR(bstrTemp);
  2310. ON_ERROR_THROW_EXCEPTION(hr);
  2311. StringCchPrintfW(szHostName, SIZE_OF_ARRAY(szHostName),
  2312. _T("%s"), (LPWSTR)_bstr_t( vVariant ));
  2313. VariantClear(&vVariant);
  2314. // Retrieve 'Query' for the trigger.
  2315. hr = m_pEventFilter->Get(_bstr_t( L"Query" ), 0, &vVariant, 0, 0);
  2316. ON_ERROR_THROW_EXCEPTION(hr);
  2317. StringCopy(m_szBuffer,(LPWSTR)_bstr_t(vVariant), SIZE_OF_ARRAY( m_szBuffer ));
  2318. VariantClear(&vVariant);
  2319. FindAndReplace(m_szBuffer,QUERY_STRING_AND,SHOW_WQL_QUERY);
  2320. FindAndReplace(m_szBuffer,L"targetinstance.LogFile",L"Log");
  2321. FindAndReplace(m_szBuffer,L"targetinstance.Type",L"Type");
  2322. FindAndReplace(m_szBuffer,L"targetinstance.EventCode",L"Id");
  2323. FindAndReplace(m_szBuffer,
  2324. L"targetinstance.SourceName",L"Source");
  2325. FindAndReplace(m_szBuffer,L" ",L" ");//to remove extra spaces
  2326. FindAndReplace(m_szBuffer,L" ",L" ");//to remove extra spaces
  2327. lTemp = StringLength(m_szBuffer, 0);
  2328. lTemp += 4; // for the safer size for allocation of memory.
  2329. // allocates memory only if new WQL is greate than previous one.
  2330. if(lTemp > m_lWQLColWidth)
  2331. {
  2332. // first free it (if previously allocated)
  2333. RELEASE_MEMORY_EX(m_pszEventQuery);
  2334. m_pszEventQuery = new TCHAR[lTemp+1];
  2335. CheckAndSetMemoryAllocation(m_pszEventQuery,lTemp);
  2336. }
  2337. lTemp = m_lWQLColWidth;
  2338. CalcColWidth(lTemp,&m_lWQLColWidth,m_szBuffer);
  2339. // Now manipulate the WQL string to get EventQuery....
  2340. FindAndReplace(m_szBuffer,SHOW_WQL_QUERY,
  2341. GetResString(IDS_EVENTS_WITH));
  2342. FindAndReplace(m_szBuffer,L" ",L" ");//to remove extra spaces
  2343. FindAndReplace(m_szBuffer,L" ",L" ");//to remove extra spaces
  2344. StringCopy(m_pszEventQuery,m_szBuffer, SIZE_OF_NEW_ARRAY( m_pszEventQuery ));
  2345. // Retrieves the "TaskScheduler" information
  2346. bstrTemp = SysAllocString(L"ScheduledTaskName");
  2347. hr = m_pTriggerEventConsumer->Get(bstrTemp, 0, &vVariant, 0, 0);
  2348. SAFE_RELEASE_BSTR(bstrTemp);
  2349. ON_ERROR_THROW_EXCEPTION(hr);
  2350. GetRunAsUserName((LPCWSTR)_bstr_t(vVariant.bstrVal), TRUE);
  2351. StringCopy( m_szScheduleTaskName, (LPWSTR) _bstr_t( vVariant ),
  2352. SIZE_OF_ARRAY( m_szScheduleTaskName ) );
  2353. VariantClear(&vVariant);
  2354. //////////////////////////////////////////
  2355. // Now Shows the results on screen
  2356. // Appends for in m_arrColData array
  2357. dwRowCount = DynArrayAppendRow( m_arrColData, NO_OF_COLUMNS );
  2358. // Fills Results in m_arrColData data structure
  2359. DynArraySetString2(m_arrColData,dwRowCount,HOST_NAME,szHostName,0);
  2360. DynArraySetDWORD2(m_arrColData ,dwRowCount,TRIGGER_ID,dwEventId);
  2361. DynArraySetString2(m_arrColData,dwRowCount,TRIGGER_NAME,szEventTriggerName,0);
  2362. DynArraySetString2(m_arrColData,dwRowCount,TASK,m_szTask,0);
  2363. DynArraySetString2(m_arrColData,dwRowCount,EVENT_QUERY,m_pszEventQuery,0);
  2364. DynArraySetString2(m_arrColData,dwRowCount,EVENT_DESCRIPTION,m_szEventDesc,0);
  2365. DynArraySetString2(m_arrColData,dwRowCount,TASK_USERNAME,m_szTaskUserName,0);
  2366. bAtLeastOneEvent = TRUE;
  2367. // Calculatate new column width for each column
  2368. lTemp = m_lHostNameColWidth;
  2369. CalcColWidth(lTemp,&m_lHostNameColWidth,szHostName);
  2370. lTemp = m_lETNameColWidth;
  2371. CalcColWidth(lTemp,&m_lETNameColWidth,szEventTriggerName);
  2372. lTemp = m_lTaskColWidth;
  2373. CalcColWidth(lTemp,&m_lTaskColWidth,m_szTask);
  2374. lTemp = m_lQueryColWidth;
  2375. CalcColWidth(lTemp,&m_lQueryColWidth,m_pszEventQuery);
  2376. lTemp = m_lDescriptionColWidth;
  2377. CalcColWidth(lTemp,&m_lDescriptionColWidth,m_szEventDesc);
  2378. // Resets current containts..if any
  2379. StringCopy( szHostName,L"", SIZE_OF_ARRAY(szHostName) );
  2380. dwEventId = 0;
  2381. StringCopy( szEventTriggerName, L"", SIZE_OF_ARRAY(szEventTriggerName));
  2382. StringCopy( m_szTask, L"", SIZE_OF_ARRAY(m_szTask));
  2383. StringCopy( m_pszEventQuery, L"", SIZE_OF_ARRAY(m_pszEventQuery));
  2384. StringCopy( m_szEventDesc, L"", SIZE_OF_ARRAY(m_szEventDesc) );
  2385. SAFE_RELEASE_INTERFACE(m_pObj);
  2386. SAFE_RELEASE_INTERFACE(m_pTriggerEventConsumer);
  2387. SAFE_RELEASE_INTERFACE(m_pEventFilter);
  2388. } // End of while
  2389. }
  2390. if(0 == StringCompare( m_pszFormat,GetResString(IDS_STRING_TABLE),
  2391. TRUE,0))
  2392. {
  2393. dwFormatType = SR_FORMAT_TABLE;
  2394. }
  2395. else if(0 == StringCompare( m_pszFormat,
  2396. GetResString(IDS_STRING_LIST),TRUE,0))
  2397. {
  2398. dwFormatType = SR_FORMAT_LIST;
  2399. }
  2400. else if(0 == StringCompare( m_pszFormat,
  2401. GetResString(IDS_STRING_CSV),TRUE,0))
  2402. {
  2403. dwFormatType = SR_FORMAT_CSV;
  2404. }
  2405. else // Default
  2406. {
  2407. dwFormatType = SR_FORMAT_TABLE;
  2408. }
  2409. if( TRUE == bAtLeastOneEvent)
  2410. {
  2411. // Show Final Query Results on screen
  2412. PrepareColumns ();
  2413. DEBUG_INFO;
  2414. if ( FALSE == IsSchSvrcRunning())
  2415. {
  2416. DEBUG_INFO;
  2417. ShowMessage(stderr,GetResString(IDS_SERVICE_NOT_RUNNING));
  2418. }
  2419. if((SR_FORMAT_CSV & dwFormatType) != SR_FORMAT_CSV)
  2420. {
  2421. ShowMessage(stdout,BLANK_LINE);
  2422. }
  2423. if( TRUE == m_bNoHeader)
  2424. {
  2425. dwFormatType |= SR_NOHEADER;
  2426. }
  2427. ShowResults(NO_OF_COLUMNS,mainCols,dwFormatType,m_arrColData);
  2428. }
  2429. else if( StringLength(m_pszTriggerID,0)> 0)
  2430. {
  2431. // Show Message
  2432. TCHAR szErrorMsg[MAX_RES_STRING+1];
  2433. TCHAR szMsgFormat[MAX_RES_STRING+1];
  2434. StringCopy(szMsgFormat,GetResString(IDS_NO_EVENTID_FOUND),
  2435. SIZE_OF_ARRAY(szMsgFormat));
  2436. StringCchPrintfW(szErrorMsg, SIZE_OF_ARRAY(szErrorMsg),
  2437. szMsgFormat,m_pszTriggerID);
  2438. ShowMessage(stdout,szErrorMsg);
  2439. }
  2440. else
  2441. {
  2442. // Show Message
  2443. ShowMessage(stdout,GetResString(IDS_NO_EVENT_FOUNT));
  2444. }
  2445. }
  2446. catch( _com_error e )
  2447. {
  2448. DEBUG_INFO;
  2449. // WMI returns string for this hr value is "Not Found." which is not
  2450. // user friendly. So changing the message text.
  2451. if( 0x80041002 == hr )
  2452. {
  2453. ShowMessage( stderr,GetResString(IDS_CLASS_NOT_REG));
  2454. }
  2455. else
  2456. {
  2457. DEBUG_INFO;
  2458. WMISaveError( e );
  2459. ShowLastErrorEx(stderr,SLE_TYPE_ERROR|SLE_INTERNAL);
  2460. }
  2461. SAFE_RELEASE_INTERFACE( pEnumCmdTriggerConsumer );
  2462. SAFE_RELEASE_INTERFACE( pEnumFilterToConsumerBinding );
  2463. return FALSE;
  2464. }
  2465. catch( CHeap_Exception )
  2466. {
  2467. WMISaveError( WBEM_E_OUT_OF_MEMORY );
  2468. ShowLastErrorEx(stderr,SLE_TYPE_ERROR|SLE_INTERNAL);
  2469. SAFE_RELEASE_INTERFACE( pEnumCmdTriggerConsumer );
  2470. SAFE_RELEASE_INTERFACE( pEnumFilterToConsumerBinding );
  2471. return FALSE;
  2472. }
  2473. SAFE_RELEASE_INTERFACE( pEnumCmdTriggerConsumer );
  2474. SAFE_RELEASE_INTERFACE( pEnumFilterToConsumerBinding );
  2475. // Operation successful.
  2476. return TRUE;
  2477. }