Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Мониторинг запущенных процессов (http://forum.oszone.net/showthread.php?t=291694)

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

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

Iska 27-11-2014 09:05 2436198

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

fontenette 27-11-2014 09:10 2436200

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

Iska 27-11-2014 09:32 2436204

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.

Время: 10:35.
© OSzone.net 2001-