 |
|
fontenette |
27-11-2014 09:02 2436195 |
Мониторинг запущенных процессов
Здравствуйте! У меня есть два скрипта:
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
Если запускать каждый из них по отдельности, то скрипты отрабатывают нормально. Подскажите, как их объединить в один скрипт.
|
fontenette, Вы не написали главного — какова глобальная цель, что Вы хотите получить в конечном итоге?
|
fontenette |
27-11-2014 09:10 2436200 |
Цель - мониторинг запуска и завершения определенного процесса. При его запуске выполнить действие (для примера в коде - показать сообщение), при его завершении выполнить другое действие. При этом может запускаться несколько копий процесса.
|
fontenette, ой, подозреваю, что это далеко не всё.
Вот пример синхронной обработки (там несколько более сложная задача, но общий принцип тот же).
Вот пример асинхронной обработки:
Скрытый текст
Код:
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 2436800 |
Iska, спасибо, вы привели подходящие примеры.
|
Время: 10:35.
© OSzone.net 2001-