При запуске процесса в VB.Net я хотел бы иметь возможность идентифицировать его, чтобы позже убить его и всех его дочерних элементов, если это необходимо.
Я запускаю свой процесс так:
Dim mainProcessHandler As New ProcessStartInfo()
Dim mainProcess As Process
mainProcessHandler.FileName = "something_01out18.bat"
mainProcessHandler.Arguments = "-d"
mainProcessHandler.WindowStyle = ProcessWindowStyle.Hidden
mainProcess = Process.Start(mainProcessHandler)
Если я сделаю
mainProcess .Kill()
он закроет все открытые окна cmd. Но ни один из других процессов, запущенных сценарием летучей мыши.
Я почти уверен, что ОС выдает идентификатор моему процессу, когда я его запускаю, но мне не удалось его получить. Если это не так, я также не нашел, как самому присвоить идентификатор процессу.
В конце концов, я хотел бы перечислить все дочерние процессы, убить их, убить родительский процесс, но ни один из других процессов «cmd», запущенных на ПК.
Есть ли способ делать такие вещи?
Основываясь на коде C#, приведенном как часть ответа на Найти все дочерние процессы моего собственного .NET-процесса, я использовал следующий код, который, похоже, работает, чтобы убить всех дочерних процессов процесса, зная его PID:
Sub killChildrenProcessesOf(ByVal parentProcessId As UInt32)
Dim searcher As New ManagementObjectSearcher(
"SELECT * " &
"FROM Win32_Process " &
"WHERE ParentProcessId = " & parentProcessId)
Dim Collection As ManagementObjectCollection
Collection = searcher.Get()
If (Collection.Count > 0) Then
consoleDisplay("Killing " & Collection.Count & " processes started by process with Id """ & parentProcessId & """.")
For Each item In Collection
Dim childProcessId As Int32
childProcessId = Convert.ToInt32(item("ProcessId"))
If Not (childProcessId = Process.GetCurrentProcess().Id) Then
killChildrenProcessesOf(childProcessId)
Dim childProcess As Process
childProcess = Process.GetProcessById(childProcessId)
consoleDisplay("Killing child process """ & childProcess.ProcessName & """ with Id """ & childProcessId & """.")
childProcess.Kill()
End If
Next
End If
End Sub
Для информации необходимо:
Imports System.Management
Затем, если вы используете Visual Studio, вам нужно перейти в меню проекта, выбрать «Добавить ссылку ...», на вкладке «.Net» прокрутить вниз до «System.Management» и выбрать строку, соответствующую « System.Management "и нажмите ОК. (как указано в этот ответ)
При правильном вызове этот Sub удовлетворительно убивает всех дочерних элементов, запущенных родительским процессом. При необходимости базовый parentProcess.kill убивает родительский процесс.
В первоначально представленном коде возникла проблема конкатенации, которая не позволяла ему работать. Таким образом, этот пост решен.
Get не является членом ManagementObjectSearcher? Я получаю эту ошибку
Мониторинг дочерних процессов процесса помогает?