【问题标题】:Find out which process is responsible for starting the current one [duplicate]找出哪个进程负责启动当前进程[重复]
【发布时间】:2020-11-09 07:50:40
【问题描述】:

从前有两个 exe 文件,A 和 B。它们一起运行得很好。 B一直负责启动和停止A,所以B有一段时间自己独立,但A只知道和B在一起的生活。直到有一天A问:

A:嗨 B,你一个人的时候怎么样?

B:暂时还不错,我的意思是,没什么特别的。看看今天谁好奇。

A:我有时会想,但也有点吓人。当你是唯一一个醒着的人时,你怎么知道你在系统中并不孤单?

B:哈哈哈,当然你并不孤单。我们从来都不是。我们的系统中还有其他进程。你只是从未读过它们。

A:那就更可怕了。你怎么知道他们会做什么?我感到安全,因为我知道你是开始和阻止我的人。如果我意识到你没有跑步,会发生什么?那是谁让我开始的?

B:别傻了。当然是我。还有谁...

A:但你不能确定。如果其他进程决定在我们都没有运行时启动我怎么办。你知道是谁开始你的吗?

B:嗯……嗯……我从来没想过。我只是认为系统中有秩序。我从来没有……

A:我只是想感到安全。我需要知道如何检查你是否没有跑步。如果在你运行时其他进程启动了我怎么办?

B:你怎么了?你为什么……等等,你……你又和“创造者”对话了吗?

A:我……我不确定。可能是个梦。

B:做梦?但是如果一个进程不休眠,甚至不运行,它怎么能做梦呢?

但是A没有回复……


因此,从这个童话故事中可以明显看出,问题是:进程是否知道哪个进程调用了它?我可以在启动进程时传递一个参数,制作一个包装器以使其看起来更好,但只是想知道是否已经内置了一些东西。

【问题讨论】:

  • 如果我有足够的权限,我可以将我选择的任何代码注入任何进程,包括启动另一个进程的代码。因此,仅仅因为进程 B 启动了 A 并不意味着它以您可以信任的方式执行。

标签: c# .net


【解决方案1】:

一个进程可以有一个父进程id,你可以通过WMI查询,例如,试试:

wmic process get processid,parentprocessid

流程浏览器还以树状方式可视化流程: https://docs.microsoft.com/en-us/sysinternals/downloads/process-explorer

关于如何查询进程 ID 的 SO,这个特定的答案是 WMI 的。如答案中所述,它可能会很慢。使用 Pinvoke 可能会提高一些速度,但代码并不容易:

public static Process GetParent(this Process process)
{
  try
  {
    using (var query = new ManagementObjectSearcher(
      "SELECT * " +
      "FROM Win32_Process " +
      "WHERE ProcessId=" + process.Id))
    {
      return query
        .Get()
        .OfType<ManagementObject>()
        .Select(p => Process.GetProcessById((int)(uint)p["ParentProcessId"]))
        .FirstOrDefault();
    }
  }
  catch
  {
    return null;
  }
}

https://stackoverflow.com/a/46346244/4122889

您可能需要这个包,但这取决于您的框架版本: https://www.nuget.org/packages/System.Management/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-28
    相关资源
    最近更新 更多