在C#中,如何可靠地杀死进程树[重复]

2023-11-27

在 C# 中,我们使用以下代码来终止进程树。 有时有效,有时无效,可能与 Windows 7 和/或 64 位有关。

它找到给定进程的子进程的方法是调用GetProcesses获取系统中的所有进程,然后调用NtQueryInformationProcess找出父进程是给定进程的每个进程。 它递归地执行此操作,以遍历树。

在线文档说NtQueryInformationProcess不应该使用。 相反,有一种东西叫做EnumProcesses,但我找不到 C# 中的任何示例,只能找到其他语言。

在 C# 中终止进程树的可靠方法是什么?

    public static void TerminateProcessTree(Process process)
    {
        IntPtr processHandle = process.Handle;
        uint processId = (uint)process.Id;

        // Retrieve all processes on the system
        Process[] processes = Process.GetProcesses();
        foreach (Process proc in processes)
        {
            // Get some basic information about the process
            PROCESS_BASIC_INFORMATION procInfo = new PROCESS_BASIC_INFORMATION();
            try
            {
                uint bytesWritten;
                Win32Api.NtQueryInformationProcess(proc.Handle, 0, ref procInfo,
                    (uint)Marshal.SizeOf(procInfo), out bytesWritten); // == 0 is OK

                // Is it a child process of the process we're trying to terminate?
                if (procInfo.InheritedFromUniqueProcessId == processId)
                {
                    // Terminate the child process (and its child processes)
                    // by calling this method recursively
                    TerminateProcessTree(proc);
                }
            }
            catch (Exception /* ex */)
            {
                // Ignore, most likely 'Access Denied'
            }
        }

        // Finally, terminate the process itself:
        if (!process.HasExited)
        {
            try
            {
                process.Kill();
            }
            catch { }
        }
    }

Use ManagmentObjectSearcher和一点递归:

private static void KillProcessAndChildren(int pid)
{
    ManagementObjectSearcher searcher = new ManagementObjectSearcher
      ("Select * From Win32_Process Where ParentProcessID=" + pid);
    ManagementObjectCollection moc = searcher.Get();
    foreach (ManagementObject mo in moc)
    {
        KillProcessAndChildren(Convert.ToInt32(mo["ProcessID"]));
    }
    try
    {
        Process proc = Process.GetProcessById(pid);
        proc.Kill();
    }
    catch (ArgumentException)
    {
        // Process already exited.
    }
 }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在C#中,如何可靠地杀死进程树[重复] 的相关文章

  • 添加 Nullable int 时保持 null?

    我想添加可为空的int 并保留null当所有值都是null 我想要这个结果 1 2 3 1 null 1 null null null O null 0 问题是 如果我将一个值与 null 相加 结果为 null int i1 1 int
  • 在路由mvc 4中添加公司名称

    我一直在尝试为 Facebook 等用户提供在 URL 中添加公司名称的选项 http localhost 50753 MyCompany Login 我尝试过不同的网址 但没有成功 routes MapRoute name Default
  • 如何在另一个应用程序中挂钩 api 调用

    我正在尝试挂钩另一个应用程序的 ExtTextOut 和 DrawTextExt GDI 方法调用 我知道我需要使用 GetProcAddress 来查找 gdi32 dll 中那些方法的地址 并用我的函数的地址覆盖我想要挂钩的进程中的地址
  • 删除是如何工作的? [复制]

    这个问题在这里已经有答案了 可能的重复 C 编程 free 如何知道要释放多少 https stackoverflow com questions 1518711 c programming how does free know how m
  • 在现代 C++ 中,临时生命周期延长何时有用?

    在 C 中 您可以将函数的返回值 返回值 而不是引用 绑定到 const 引用 并且代码仍然有效 因为该临时对象的生命周期将延长到作用域末尾 例如 std string get string return abc void f const
  • 从模板切换传递的类型

    在 C 中是否可以检查传递给模板函数的类型 例如 template
  • Gwan C#,如何获取HTTP标头?

    我需要它来重写 url 以了解我正在处理哪个友好的 url 用于用户代理和其他东西 EDIT public class Gwan MethodImplAttribute MethodImplOptions InternalCall exte
  • 获取 boost Spirit 语法中的当前行

    我正在尝试使用 boostspirit 获取正在解析的文件的当前行 我创建了一个语法类和结构来解析我的命令 我还想跟踪在哪一行找到命令并将其解析到我的结构中 我将 istream 文件迭代器包装在 multi pass 迭代器中 然后将其包
  • 使用查询表达式对 List 进行排序

    我在使用 Linq 订购这样的结构时遇到问题 public class Person public int ID get set public List
  • 将接口转换为其具体实现对象,反之亦然?

    在 C 中 当我有一个接口和几个具体实现时 我可以将接口强制转换为具体类型 还是将具体类型强制转换为接口 这种情况下的规则是什么 Java 和 C 中都允许这两个方向 向下转型需要显式转型 如果对象类型不正确 可能会抛出异常 然而 向上转换
  • 搜索实体的所有字段

    我正在尝试在客户数据库上实现 多功能框 类型的搜索 其中单个查询应尝试匹配客户的任何属性 这是一些示例数据来说明我想要实现的目标 FirstName LastName PhoneNumber ZipCode Mary Jane 12345
  • Project Euler #8,我不明白我哪里出了问题[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我正在做项目欧拉第八题 https projecteuler net problem 8 其中我得到了这个大得离谱的数字 7316
  • 使用 GCC 生成可读的程序集?

    我想知道如何使用GCC http en wikipedia org wiki GNU Compiler Collection在我的 C 源文件中转储机器代码的助记符版本 这样我就可以看到我的代码被编译成什么 你可以使用 Java 来做到这一
  • 逆向工程 ASP.NET Web 应用程序

    我有一个 ASP NET Web 应用程序 我没有源代码 该 bin 包含 10 个程序集和一个 compiled 文件 我在 App Code dll 上使用 Reflector 它向我显示了类和命名空间之类的东西 但它太混乱了 有没有什
  • 如何调试 .NET 运行时中的内部错误?

    我正在尝试调试一些处理大文件的工作 代码本身works 但 NET 运行时本身会报告零星错误 对于上下文 这里的处理是一个 1 5GB 文件 仅加载到内存中一次 在循环中处理和释放 故意尝试重现此否则不可预测的错误 我的测试片段基本上是 t
  • 需要提取字符串中点后的最后一个数字,如“7.8.9.1.5.1.100”

    我需要提取 C 字符串中最后一个点后面的最后一个数字 例如 7 8 9 1 5 1 100 并将其存储在整数中 Added 该字符串也可以是 7 8 9 1 5 1 1 或 7 8 9 1 5 1 0 我还想验证它在最后一个点之前恰好是 7
  • 为什么以下 C 程序会出现总线错误?

    我认为这是第一个失败的 strtok 调用 好久没写C了 有点不知所措 非常感谢 include
  • LINQ 中的“from..where”或“FirstOrDefault”

    传统上 当我尝试从数据库中获取用户的数据时 我使用了以下方法 在某种程度上 DbUsers curUser context DbUsers FirstOrDefault x gt x u LoginName id string name c
  • 如何将 SQL“LIKE”与 LINQ to Entities 结合使用?

    我有一个文本框 允许用户指定搜索字符串 包括通配符 例如 Joh Johnson mit ack on 在使用 LINQ to Entities 之前 我有一个存储过程 该存储过程将该字符串作为参数并执行以下操作 SELECT FROM T
  • 为什么匹配模板类上的部分类模板特化与没有模板匹配的另一个部分特化不明确?

    这个问题可能很难用标题中的句子来描述 但这里有一个最小的例子 include

随机推荐

  • 将原始 diff 文件转换为彩色 html 输出

    有谁知道有一个脚本可以接受原始 diff 文件和漂亮的打印 HTML 输出 这将更容易审查 邮寄 谷歌搜索给我返回了一些结果 例如http kafka fr free fr diff2html 然而 所有这些脚本都需要两个文件作为输入 它们
  • “CLR20r3”代表什么? (clr是什么版本的)

    显而易见的选择是 CLR version 2 0 revision 3 但不幸的是没有这样的东西 我能得出的最接近的最终清单是维基百科 但使用主要 次要编号系统 出现此问题的原因是 我有一位客户尝试运行我的 net4 应用程序 但它不断崩溃
  • 隐藏(或加密)应用程序资源?

    我正在开发一个 Cocoa 应用程序 它具有我希望保护但仍显示的某些资源 图像 通常情况下 人们会将它们放在资源文件夹中 但存储在那里使得抓取和使用变得非常容易 有什么方法可以隐藏这些图像 但仍然可以在应用程序中访问它们 简单的解决方案 将
  • 如何修复 java.lang.AbstractMethodError: 未实现抽象方法

    我有这个活动 我得到了崩溃 说 java lang AbstractMethodError 抽象方法未实现 我该如何解决它 这就像我让活动成为未实现的东西的元素 但我不知道如何修复它 我多次遇到这个问题 但我不知道如何解决 public c
  • PHP 中的注册表模式还是单例模式?

    我现在正在使用 PHP 类和对象 在这个问题中 字段和方法的名称只是为了让您了解我在说什么而编写的 它与使用单例和注册表设计模式有关 现在假设我需要访问数据库对象 缓存对象 核心设置对象 会话对象 几乎所有其他类中我都需要访问这些对象 所以
  • 使用 python 和 FFT 计算均方位移

    给定一个二维数组 其中每行代表粒子的位置向量 如何有效计算均方位移 使用 FFT 均方位移定义为 其中r m 是第m行的位置向量 N是行数 以下针对 msd 的直接方法有效 但它是 O N 2 我改编了此代码stackoverflow 用户
  • ReplaceAll 为 java8 lambda 函数

    给定以下变量 templateText Hi name variables put name Joe 我想使用以下代码将占位符 name 替换为值 Joe 这不起作用 variables keySet forEach k gt templa
  • MySQL 中的 DOUBLE 与 DECIMAL

    好的 所以我知道有大量文章指出我不应该使用 DOUBLE 在 MySQL 数据库上存储资金 否则我最终会遇到棘手的精度错误 重点是我不是在设计一个新的数据库 而是要求我找到优化现有系统的方法 新版本包含 783 个 DOUBLE 类型列 其
  • 在Android中使用jobb工具

    我正在运行以下命令来获取加密的 obb 文件以进行 apk 扩展 jobb d home manoj Desktop Test o main 1 com example helloworld obb k manoj pn com examp
  • Django Rest Framework 在 POST 中接收主键值并将模型对象作为嵌套序列化器返回

    我不完全确定我的问题的标题是否像我希望的那样具体 但情况是这样的 我有一个HyperlinkedModelSerializer看起来像这样 class ParentArrivalSerializer serializers Hyperlin
  • 如何在magento中获取当前产品的类别名称(在产品详细信息页面上)

    我使用了以下代码 但不适用于这种情况 category detail Mage registry current category echo category detail gt getName got 致命错误 在 app design
  • 视图未附加到窗口管理器(解决方案是什么?)

    我从我的应用程序中收到了数百个错误报告 而且所有错误报告都是相同的 这真的很烦人 因为在我的测试设备 HTC Wildfire Galaxy S I II III Galaxy Mini Galaxy Tab 10 中 这个错误从未发生过
  • x86 中“PAUSE”指令的用途是什么?

    我正在尝试创建一个自旋锁的愚蠢版本 浏览网页时 我在 x86 中发现了一条名为 PAUSE 的汇编指令 该指令用于向处理器提示自旋锁当前正在该 CPU 上运行 英特尔手册和其他可用信息指出 处理器使用此提示来避免内存顺序冲突 大多数情况下
  • Swift Playgrounds:替换 captureValue(_:withIdentifier:)

    Xcode 7 3已弃用 XCPlaygroundPage currentPage captureValue withIdentifier 它的前身 XCPCaptureValue was 已弃用在 Xcode 7 1 中 我想知道除了集合
  • 非凸优化器

    我使用 python2 7 需要找到多元标量函数的最大值 换句话说 我有这个功能 def myFun a b c d e f complex calculation that takes about 30 seconds return re
  • Python中的(1,)和(1)有什么区别[重复]

    这个问题在这里已经有答案了 正如标题所述 我发现 1 and 1 是不同的 但它们有什么区别呢 In 39 1 1 Out 39 False 试试这个来说服自己 gt gt gt type 1
  • 将 JavaScript 变量传递给 AngularJs ng-init

    我定义了以下 javascript 变量并需要传递memId值传入 AngularJs init 函数 div class mini 我收到错误 memId没有定义 您需要使用 角度 方式来完成此操作 window var app angu
  • 如何以最小的影响重新启动 CSS 动画

    有没有一种方法可以重新启动 CSS 动画 而无需克隆元素 回流 DOM 等待 setTimeout onAnimationEnd EDIT 无需 jQuery 或检查 我基本上只是在下一个绘制的帧处重新启动动画 此方法不会克隆任何元素 重排
  • 处理带有未知 IPv6 扩展标头的数据包

    Question 是否应该丢弃带有未知 IPv6 扩展标头的数据包 Details 我无法通过检查找到这个问题的答案RFC 这本书IPv6 要点第 22 页指出 如果节点需要下一个标头但无法识别下一个标头字段中的值 则需要丢弃该数据包并向数
  • 在C#中,如何可靠地杀死进程树[重复]

    这个问题在这里已经有答案了 在 C 中 我们使用以下代码来终止进程树 有时有效 有时无效 可能与 Windows 7 和 或 64 位有关 它找到给定进程的子进程的方法是调用GetProcesses获取系统中的所有进程 然后调用NtQuer