确定在 VB.Net 中启动的进程,以便稍后能够杀死它及其所有子进程

Identify a process started in VB.Net to be able to kill it and all its children later

在 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 windows。但是 none 已经由 bat 脚本启动的任何其他进程。

我很确定 OS 在我启动进程时为我的进程提供了一个 ID,但我没有成功获取它。如果不是这样,我也没有找到如何给进程自己一个 ID。

归根结底,我想列出所有子进程,杀死它们,杀死父进程,但 none 上的另一个 "cmd" 进程 运行个人电脑。

有没有办法做这样的事情?

根据作为对 Find all child processes of my own .NET process 的回答的一部分给出的 C# 代码,我使用了以下代码,这些代码似乎可以杀死知道其 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,则需要进入项目菜单 select "Add Reference...",在“.Net”选项卡下,向下滚动到 "System.Management" 和 select 与 "System.Management" 对应的行,然后单击确定。 (如this answer所述)

如果正确调用,这个 Sub 可以杀死父进程启动的所有子进程。如果需要,基本 parentProcess.kill 终止父进程。