VBS/WSH/JS - Мониторинг запущенных процессов

Ответить
Аватара пользователя
fontenette

VBS/WSH/JS - Мониторинг запущенных процессов

Сообщение fontenette »

Здравствуйте! У меня есть два скрипта:



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

Re: VBS/WSH/JS - Мониторинг запущенных процессов

Сообщение Iska »

fontenette, Вы не написали главного — какова глобальная цель, что Вы хотите получить в конечном итоге?
Аватара пользователя
Iska

Re: VBS/WSH/JS - Мониторинг запущенных процессов

Сообщение Iska »

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

Re: VBS/WSH/JS - Мониторинг запущенных процессов

Сообщение fontenette »

fontenette, ой, подозреваю, что это далеко не всё.



Вот
VBS/WSH/JS - [решено] Запрет на повторный запуск процесса
синхронной обработки (там несколько более сложная задача, но общий принцип тот же).



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



Скрытый текст

[spoiler]Код:
[/spoiler]

Код: Выделить всё

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

Re: VBS/WSH/JS - Мониторинг запущенных процессов

Сообщение fontenette »

Iska, спасибо, вы привели подходящие примеры.
Ответить

Вернуться в «Скриптовые языки администрирования Windows»