Могу ли я создать дочерний процесс, используя сценарии WMI VB? - PullRequest
1 голос
/ 05 декабря 2008

Используя сценарии WMI VB, я хотел бы создать / присоединить несколько дочерних процессов к родительскому процессу, такому как процесс проводника.

Когда приложение запускается нажатием на него, оно становится дочерним процессом процесса проводника. То же самое верно для всех приложений, которые загружаются при запуске Windows.

Если вы убьете процесс проводника с помощью опции контекстного меню «End Process Tree» в диспетчере задач, он также уничтожит все дочерние процессы процесса проводника (быстрый, грубый метод очистки памяти без перезагрузки).

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

Большинство процессов / приложений в моих скриптах загружаются при запуске, поэтому они являются потомками процесса проводника. Когда я убиваю дерево процессов проводника, все эти процессы умирают, как объяснялось ранее.

Когда я перезапускаю эти приложения с помощью скрипта, они больше не являются дочерними элементами процесса проводника. Когда я уничтожаю дерево процессов kill explorer, приложения, запускаемые сценарием, не умирают.

Теперь я знаю, что могу уничтожить каждый процесс по отдельности, используя скрипт. Но было бы неплохо просто убить дерево процессов проводника в скрипте, не указывая отдельные приложения, которые я хочу убить.

Итак, если у меня есть один сценарий, который может запускать мои приложения как дочерние элементы процесса проводника, мой другой сценарий просто должен уничтожить дерево процессов проводника.

У меня есть скрипт, который делает именно это. Он проходит и уничтожает все дочерние процессы процесса проводника. Однако он работает только с приложениями, которые загружаются при запуске или по которым щелкают.

Кроме того, предотвращая загрузку этих приложений при запуске, Windows загружается НАМНОГО быстрее. Позже я нажимаю на иконку своего скрипта, чтобы при необходимости загружать приложения.

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

Интересное примечание: я должен отложить уничтожение любых командных / консольных процессов, в противном случае скрипт может убить себя, прежде чем получить остальные процессы.

Есть идеи, как это можно сделать?

Ниже мой код, который не работает.

Option Explicit
dim wmi, rootProcessName, rootProcess, objStartup, objConfig, objProcess, strComputer, dropbox, itunes, skype
strComputer = "."

dropbox="C:\Program Files\Dropbox\Dropbox.exe"
itunes="C:\Program Files\iTunes\iTunes.exe"
skype="C:\Program Files\Skype\Phone\Skype.exe"

Const NORMAL = 32
Set wmi = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set objStartup =  wmi.Get("Win32_ProcessStartup")
Set objConfig = objStartup.SpawnInstance_
objConfig.PriorityClass = NORMAL

rootProcessName = "'explorer.exe'"
set rootProcess = wmi.ExecQuery("Select * from Win32_Process Where Name = " & rootProcessName )
For Each objProcess in rootProcess
    objProcess.Create dropbox, null, objConfig
    objProcess.Create itunes, null, objConfig
    objProcess.Create skype, null, objConfig
Next

WScript.Quit

1 Ответ

1 голос
/ 06 сентября 2013

Процесс окна отслеживает идентификатор процесса того, кто его создал, это то, как управляются отношения. Чтобы получить то, что вы хотите, вам нужно либо изменить родительский PID, хранящийся в дочернем процессе, либо внедрить код в процесс, родительским процессом которого вы хотите, и создать новый дочерний процесс. Ни один из них действительно выполним.

Реальным решением является использование Объектов заданий , чтобы вы могли одновременно завершать все процессы, связанные с заданием. Но вам придется перейти с VBScript.

...