Определите процесс, запущенный в VB.Net, чтобы потом убить его и всех его потомков - PullRequest
0 голосов
/ 04 сентября 2018

При запуске процесса в 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. Но ни один из других процессов, запущенных сценарием bat.

Я почти уверен, что ОС дает идентификатор моему процессу, когда я его запускаю, но мне не удалось его получить. Если это не так, я не нашел и того, как самому идентифицировать процесс.

В конце дня я хотел бы перечислить все дочерние процессы, уничтожить их, уничтожить родительский процесс, но ни один из других процессов «cmd», запущенных на ПК.

Есть ли способ сделать такие вещи?

1 Ответ

0 голосов
/ 04 сентября 2018

На основе кода 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 уничтожает родительский процесс.

...