gpt4 book ai didi

c# - 在 C# 中终止进程时,我如何确定我正在终止正确的进程?

转载 作者:行者123 更新时间:2023-11-30 13:45:37 28 4
gpt4 key购买 nike

总体目标

我正试图通过我当前拥有的特定名称(下面的 notepad.exe)终止所有进程。一般来说,它遵循以下原则:

  • 获取我拥有的具有特定名称的所有应用程序
    • 在这种情况下,“我”通常是一个服务帐户
  • 杀死所有的人。

问题

  • 从我获取一个 PID 到我杀死它的这段时间,产生另一个使用该 PID 的应用程序的可能性有多大?如果我抓取一个 ID 为 123 的 PID,它可能已经关闭并且另一个应用程序现在拥有 PID 123 的可能性有多大?
  • 我可以合理地实现这一目标同时限制我关闭错误 PID 的可能性的最佳方式是什么?

到目前为止我有什么

下面的代码基于另一个 SO 答案,并使用 WMI 通过特定名称获取所有进程并列出用户。

下一步:下一步是终止我拥有的进程;但是,我如何判断我在此处拥有的 PID 将与我试图杀死的 PID 相同?

static void Main(string[] args)
{
const string PROCESS_NAME = "notepad.exe";
var queryString = string.Format("Name = '{0}'", PROCESS_NAME);

var propertiesToSelect = new[] { "Handle", "ProcessId" };
var processQuery = new SelectQuery("Win32_Process", queryString, propertiesToSelect);

using (var searcher = new ManagementObjectSearcher(processQuery))
{
using (var processes = searcher.Get())
foreach (var aProcess in processes)
{
var process = (ManagementObject)aProcess;
var outParameters = new object[2];
var result = (uint)process.InvokeMethod("GetOwner", outParameters);

if (result == 0)
{
var user = (string)outParameters[0];
var domain = (string)outParameters[1];
var processId = (uint)process["ProcessId"];

Console.WriteLine("PID: {0} | User: {1}\\{2}", processId, domain, user);
// TODO: Use process data...
}
else
{
// TODO: Handle GetOwner() failure...
}
}

}

Console.ReadLine();
}

最佳答案

是的,有杀死错误进程的风险。 PID 的重用可能是一个历史事故,多年来引起了很多悲痛。

这样做:

  1. 找到您要杀死的 PID。
  2. 获取这些进程的句柄以稳定 PID。请注意,这可能会获取错误进程的句柄。
  3. 重新找到您要杀死的 PID。
  4. 终止那些您已稳定并在第二个查找结果集中的进程。

通过插入这个锁定和验证步骤,您可以确定。

关于c# - 在 C# 中终止进程时,我如何确定我正在终止正确的进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28224790/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com