PDA

Показать полную графическую версию : Мониторинг запущенных процессов


fontenette
27-11-2014, 09:02
Здравствуйте! У меня есть два скрипта:

1. Мониторинг запуска процесса (для примера, калькулятора)


Const ProcName = "calc.exe"
Set colEvents = GetObject("winmgmts:\\.\Root\CIMV2").ExecNotificationQuery( _
"SELECT * FROM __InstanceCreationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_Process' " & _
"AND TargetInstance.Name = '" & ProcName & "'")
do
Set objEvent = colEvents.NextEvent
MsgBox "Вы запустили процесс " & objEvent.TargetInstance.Name
loop


2. Мониторинг завершения процесса (для примера, того же калькулятора)


Const ProcName = "calc.exe"
Set colEvents = GetObject("winmgmts:\\.\Root\CIMV2").ExecNotificationQuery( _
"SELECT * FROM __InstanceDeletionEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_Process' " & _
"AND TargetInstance.Name = '" & ProcName & "'")
do
set objEvent = colEvents.NextEvent
MsgBox "Вы закрыли процесс " & objEvent.TargetInstance.Name
loop


Если запускать каждый из них по отдельности, то скрипты отрабатывают нормально. Подскажите, как их объединить в один скрипт.

Iska
27-11-2014, 09:05
fontenette, Вы не написали главного — какова глобальная цель, что Вы хотите получить в конечном итоге?

fontenette
27-11-2014, 09:10
Цель - мониторинг запуска и завершения определенного процесса. При его запуске выполнить действие (для примера в коде - показать сообщение), при его завершении выполнить другое действие. При этом может запускаться несколько копий процесса.

Iska
27-11-2014, 09:32
fontenette, ой, подозреваю, что это далеко не всё.

Вот пример (http://forum.oszone.net/post-2142215.html#post2142215) синхронной обработки (там несколько более сложная задача, но общий принцип тот же).

Вот пример асинхронной обработки:
Option Explicit

Dim strProcessName

Dim strComputer

Dim objSWbemLocator
Dim objSWbemServicesEx
Dim objSWbemSink


strProcessName = "notepad.exe"

strComputer = "."

Set objSWbemLocator = WScript.CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServicesEx = objSWbemLocator.ConnectServer(strComputer, "root\cimv2")
Set objSWbemSink = WScript.CreateObject("WbemScripting.SWbemSink","Sink_")

objSWbemServicesEx.ExecNotificationQueryAsync objSWbemSink, _
"SELECT * FROM __InstanceOperationEvent WITHIN 1 " & _
"WHERE TargetInstance ISA 'Win32_Process' AND " & _
"TargetInstance.Name = '" & strProcessName & "'"

WScript.Echo "Waiting for process..."

Do
WScript.Sleep 100
Loop

objSWbemSink.Cancel

Set objSWbemSink = Nothing
Set objSWbemServicesEx = Nothing
Set objSWbemLocator = Nothing

WScript.Quit 0
'=============================================================================

'=============================================================================
Sub Sink_OnObjectReady(objSWbemObject, objSWbemAsyncContext)
With objSWbemObject
WScript.Echo Now(), vbTab, .Path_.Class, vbTab, .TargetInstance.Name, vbTab, .TargetInstance.ProcessID
End With
End Sub
'=============================================================================

fontenette
28-11-2014, 10:36
Iska, спасибо, вы привели подходящие примеры.




© OSzone.net 2001-2012