1

Тема: VBS: Скрипт который мониторит процесс

Добрый день коллеги, к сожалению не осилил данную скрипт в виду нехватки знаний по  VBS, прошу помочь. Есть скрипт который запускаеться с загрузкой системы его задача, мониторить появления процесса1 в taskmanager, при появлении процесса1 идет исполнение на закрытие другого процесса2,  а при закритии процесса1  идет  возобновление  процесса2. Текущий скрипт отрабатывает, но через какое то время закрываеться, необходимо что бы скрипт постоянно висел в системе и контролировал данную ситауцию.

Set WshShell = CreateObject("WScript.Shell") 
Set WshShell = Nothing

On error resume next
Set WshShell = WScript.CreateObject("WScript.Shell")
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")

' Cores Counting
Const wbemFlagReturnImmediately = &h10
Const wbemFlagForwardOnly = &h20
strComputer = "."

   Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")
   Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_Processor", "WQL", _
                                          wbemFlagReturnImmediately + wbemFlagForwardOnly)
cores = 0
For Each objItem In colItems
    cores = cores + objItem.NumberOfLogicalProcessors
Next
cores = cores - 1
' General Launching and Checking
do
' Proc1
Set taskcolitem = objWMIService.ExecQuery("Select * from Win32_Process")
taskmgrisrun=false
For Each objItem in taskcolitem
If objItem.Name = "proc1.exe" OR objItem.Name = "proc1.exe" Then
taskmgrisrun = True
Exit For
End If
Next
' End Proc1
Running = False
Set colItems = objWMIService.ExecQuery("Select * from Win32_Process")
For Each objItem in colItems
If objItem.Name = "proc2.exe" Then
Running = True
Set thisprocess=objItem
Exit For
End If
Next
For Each objItem in colItems 
If taskmgrisrun Then
    If Running Then
        thisprocess.Terminate
    End if
    If Not Running Then
        Running=True		
    End if
Exit For
End if
Next
If Not Running Then
    WshShell.Run "proc2.exe" & cores, 0
End if
Loop 

2 (изменено: svoboden, 2018-03-29 00:30:39)

Re: VBS: Скрипт который мониторит процесс

Пример для калькулятора и блокнота:

Set WSHShell = WScript.CreateObject("WScript.Shell")
Const ProcName = "calc.exe"
Set colEvents = GetObject("winmgmts:\\.\Root\CIMV2").ExecNotificationQuery( _
  "SELECT * FROM __InstanceOperationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_Process' " & _
  "AND TargetInstance.Name = '" & ProcName & "'")
Do 
 With colEvents.NextEvent
  'если процесс запускается
  If .Path_.Class = "__InstanceCreationEvent" Then
       WshShell.Run "taskkill /f /IM notepad.exe", 0
  'если процесс завершается
  ElseIf .Path_.Class = "__InstanceDeletionEvent" Then
     WshShell.Run "notepad.exe"
  End If
 End With
Loop

3

Re: VBS: Скрипт который мониторит процесс

svoboden
Спасибо за ответ, но не работает, решил попробовать ваш пример не меняя ничего, скрипт запускаеться без проблем но не запускает блокнот!

4

Re: VBS: Скрипт который мониторит процесс

astra95, а приложение калькулятора [calc.exe] Вы при этом запустили ?

Такой вариант скрипта, как приведён выше, требует, чтобы calc.exe был запущен после запуска скрипта (Т.е если calc.exe был запущен до запуска скрипта, то уже условие не сработает, т.к скрипт мониторит именно появление новых процессов и игнорирует старые.)

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

5 (изменено: svoboden, 2018-03-30 18:24:17)

Re: VBS: Скрипт который мониторит процесс

astra95 пишет:

но не запускает блокнот!

А он и не должен его запускать, если не закроется процесс calc.exe.

6

Re: VBS: Скрипт который мониторит процесс

Xameleon
В том то и дел что мой вариант хоть и не полноценный запускает процесс, а этот вариант нет !

svoboden
Честно сказать я тоже интерпритировал работу скрипта так же как и Xameleon. Как же он тогда отрабатывает ?

7 (изменено: astra95, 2018-03-29 15:55:23)

Re: VBS: Скрипт который мониторит процесс

svoboden
Я понял какк он отробатывает, получаеться он отслеживает сам диспетчер задач. Попробую его приминить к своему процессу, спасибо.
Все отробатывает, но не хватает изначального запуска процесса хотелось бы сделать это в одном скрипте, если можете помогите пожалуйста !

Все таки скрипт не отрабатывает как нужно при длительном простое, при открытии calc.exe  не закрываеться notepad.exe, за то ликвидируеться сам скрипт !

8 (изменено: svoboden, 2018-03-31 04:00:34)

Re: VBS: Скрипт который мониторит процесс

astra95, изначальный запуск - это не самая большая проблема. Ваш вопрос изначально сложный, т.к. не понятно, как должен вести себя скрипт, если вы откроете, например, блокнот, когда запущен калькулятор.

astra95 пишет:

Все таки скрипт не отрабатывает как нужно при длительном простое

Если скрипт автоматически закрывается, то посмотрите, стоит ли галочка: "Остановить сценарий после указанного числа секунд" в параметрах сервера сценариев.

9

Re: VBS: Скрипт который мониторит процесс

svoboden, озадачился непонятным явлением. Запустил Ваш скрипт у себя на Win 10. Работает то нормально, то нестабильно. Периодически не реагирует на запуск калькулятора. Хотя всё написано просто и понятно и кода то пара строк. К сожалению, в будни времени изучить не было, решил в выходные разобраться. Оказалось на Win 10 при запуске calc.exe, попеременно стартует то процесс calc.exe, то calculator.exe, хотя  на экране визуально запускается одно и тоже приложение. Вот же ж микрософтовцы намудрили.

Решил отладиться на таком коде и тут же увидел в чём дело.


EnableConsoleMode()

Set colEvents = GetObject("winmgmts:\\.\Root\CIMV2").ExecNotificationQuery( _
	"SELECT * FROM " & _
		"__InstanceCreationEvent WITHIN 1 " & _
	"WHERE " & _ 
		"TargetInstance ISA 'Win32_Process'")
Do
	With colEvents.NextEvent
		WScript.Echo .TargetInstance.Name
	End With
Loop
	
Sub EnableConsoleMode()
	If InStr(1,WScript.FullName,"cscript.exe") < 1 Then
		CreateObject("WScript.Shell").Run("cscript //nologo """ & WScript.ScriptFullName & """")
		WScript.Quit
	End if
End Sub

https://i.imgur.com/43oYFQ1.png

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

10

Re: VBS: Скрипт который мониторит процесс

Спасибо всем кто откликнулся, решил всетаки использовать свой первоначальный скрипт с ключем запуска //T: 35500 теперь все отрабатывает как надо !

11 (изменено: teadrinker, 2024-01-26 19:42:48)

Re: VBS: Скрипт который мониторит процесс

Xameleon
Здравствуйте мне очень понравился код но можно ли сделать так чтоб срабатывало не только один "calc.exe" а несколько?
Например "calc.exe","calc2.exe","calc3.exe".


Set WSHShell = WScript.CreateObject("WScript.Shell")
Const ProcName = "calc.exe"
Set colEvents = GetObject("winmgmts:\\.\Root\CIMV2").ExecNotificationQuery( _
  "SELECT * FROM __InstanceOperationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_Process' " & _
  "AND TargetInstance.Name = '" & ProcName & "'")
Do 
 With colEvents.NextEvent
  'если процесс запускается
  If .Path_.Class = "__InstanceCreationEvent" Then
       WshShell.Run "taskkill /f /IM notepad.exe", 0
  'если процесс завершается
  ElseIf .Path_.Class = "__InstanceDeletionEvent" Then
     WshShell.Run "notepad.exe"
  End If
 End With
Loop

12 (изменено: Xameleon, 2024-01-29 23:32:05)

Re: VBS: Скрипт который мониторит процесс

zcccz, приветствую ! Да, без проблем.


Option Explicit
Dim arrProcessNames
Dim strProcessName
Dim strWqlQuery
Dim colEvents 

RunInConsoleMode()

arrProcessNames = Array("calc.exe","calculator.exe","win32calc.exe","notepad.exe")
strWqlQuery = "SELECT * FROM __InstanceOperationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_Process' AND (TargetInstance.Name = '" & Join(arrProcessNames, "' OR TargetInstance.Name = '") & "')"
Set colEvents = GetObject("winmgmts:\\.\Root\CIMV2").ExecNotificationQuery(strWqlQuery)

Do 
	With colEvents.NextEvent
		'если процесс запускается
		If .Path_.Class = "__InstanceCreationEvent" Then
			Wsh.Echo "Process " &  .TargetInstance.Name & "[" & .TargetInstance.ProcessId & "] created"
		'если процесс завершается
		ElseIf .Path_.Class = "__InstanceDeletionEvent" Then
			Wsh.Echo "Process " &  .TargetInstance.Name & "[" & .TargetInstance.ProcessId & "] terminated"
		End If
	End With
Loop

Sub RunInConsoleMode()
	If InStr(1,WScript.FullName,"cscript.exe") < 1 Then
		CreateObject("WScript.Shell").Run("cscript //nologo """ & WScript.ScriptFullName & """")
		WScript.Quit
	End if
End Sub
Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

13 (изменено: zcccz, 2024-01-30 16:16:11)

Re: VBS: Скрипт который мониторит процесс

Xameleon пишет:

zcccz, приветствую ! Да, без проблем.

Спасибо конечно но вы не тот код изменили .
Мне нужно именно этот изменить .

Set WSHShell = WScript.CreateObject("WScript.Shell")
Const ProcName = "calc.exe"
Set colEvents = GetObject("winmgmts:\\.\Root\CIMV2").ExecNotificationQuery( _
  "SELECT * FROM __InstanceOperationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_Process' " & _
  "AND TargetInstance.Name = '" & ProcName & "'")
Do 
 With colEvents.NextEvent
  'если процесс запускается
  If .Path_.Class = "__InstanceCreationEvent" Then
       WshShell.Run "taskkill /f /IM notepad.exe", 0
  'если процесс завершается
  ElseIf .Path_.Class = "__InstanceDeletionEvent" Then
     WshShell.Run "notepad.exe"
  End If
 End With
Loop

А ваш пробую и совершенно не то получается.

14

Re: VBS: Скрипт который мониторит процесс

zcccz, так а что вам мешает использовать тот код, который я привёл в примере ? Вы спросили:

можно ли сделать так чтоб срабатывало не только один "calc.exe" а несколько?

В примере моего кода это реализовано.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

15 (изменено: zcccz, 2024-02-01 00:20:44)

Re: VBS: Скрипт который мониторит процесс

Xameleon пишет:

В примере моего кода это реализовано.

Ну первое черное окно которое показывает какой процесс открылся потом закрылся .Пробую WshShell.Run "taskkill /f /IM notepad.exe", 0 просит WshShell.Run  и много какие моменты.
А тот код который дал он работает совершенно по другому .
Если вы сможете изменить код который я дал очень буду признателен .

16

Re: VBS: Скрипт который мониторит процесс

...


Option Explicit
Dim arrProcessNames
Dim strProcessName
Dim strWqlQuery
Dim colEvents 
Dim objWshShell

arrProcessNames = Array("calc1.exe","calc2.exe","calc3.exe")
Set objWshShell = CreateObject("WScript.Shell")
strWqlQuery = "SELECT * FROM __InstanceOperationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_Process' AND (TargetInstance.Name = '" & Join(arrProcessNames, "' OR TargetInstance.Name = '") & "')"
Set colEvents = GetObject("winmgmts:\\.\Root\CIMV2").ExecNotificationQuery(strWqlQuery)

Do 
	With colEvents.NextEvent
		'если процесс запускается
		If .Path_.Class = "__InstanceCreationEvent" Then
			objWshShell.Run "taskkill /f /IM notepad.exe", 0
		'если процесс завершается
		ElseIf .Path_.Class = "__InstanceDeletionEvent" Then
			objWshShell.Run "notepad.exe"
		End If
	End With
Loop
Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

17 (изменено: zcccz, 2024-02-01 21:58:47)

Re: VBS: Скрипт который мониторит процесс

Xameleon пишет:

Отлично то что нужно большое спасибо .:)
Но есть маленький минус не получается сверху добавить другой скрипт например "On Error Resume Next".
А точнее хочется чтоб была защита от повторного запуска этого скрипта.
Так сказать сделать последний штрих .