2013-12-04 4 views
0

Я пытаюсь убить процесс через VBScript, но у него есть дочерний процесс, который, как я подозреваю, перезапускает его. Программа В настоящее время я использую это:Как убить дочерние процессы с помощью VBScript?

Const strComputer = "." 
Set WshShell = CreateObject("WScript.Shell") 
Dim objWMIService, colProcessList 
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") 
Set colProcessList = objWMIService.ExecQuery("SELECT * FROM Win32_Process WHERE Name = 'Process.exe'") 
For Each objProcess in colProcessList 
    WshShell.Exec "PSKill " & objProcess.ProcessId 
Next 

Это лучше для меня, потому что процесс проходит под SYSTEM, и, таким образом, может быть трудно убить objProcess.terminate(). Как я могу получить все дочерние процессы и убить их тоже?

ответ

0

Во-первых, вам необходимо определить текущий идентификатор процесса. Вы можете использовать функцию CurrProcessId, которую я поделил ранее: https://stackoverflow.com/a/8438209/893670
После определения текущего идентификатора процесса в дополнение к столбцу Name вам необходимо отфильтровать столбец ParentProcessId с вашим текущим значением идентификатора процесса. Затем вы можете завершить нумерованный объект процесса с использованием метода .Terminate в цикле или выполнить PSKill " & objProcess.ProcessId, если хотите.

Randomize 
Function CurrProcessId 
    Dim oShell, sCmd, oWMI, oChldPrcs, oCols, lOut 
    lOut = 0 
    Set oShell = CreateObject("WScript.Shell") 
    Set oWMI = GetObject(_ 
     "winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2") 
    sCmd = "/K @echo " & Int(Rnd * 3333) * CDbl(Timer) \ 1 
    oShell.Run "%comspec% " & sCmd, 0 
    WScript.Sleep 100 
    Set oChldPrcs = oWMI.ExecQuery(_ 
     "Select * From Win32_Process Where CommandLine Like '%" & sCmd & "'", ,32) 
    For Each oCols In oChldPrcs 
     lOut = oCols.ParentProcessId 
     oCols.Terminate 
     Exit For 
    Next 
    Set oChldPrcs = Nothing 
    Set oWMI = Nothing 
    Set oShell = Nothing 
    CurrProcessId = lOut 
End Function 

Dim PID 
    PID = CurrProcessId 

Const strComputer = "." 
Dim objWMIService, colProcessList 
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") 
Set colProcessList = objWMIService.ExecQuery("SELECT * FROM Win32_Process WHERE Name = 'Process.exe' And ParentProcessId = " & PID) 
For Each objProcess in colProcessList 
    objProcess.Terminate 
Next 
Смежные вопросы