在命令提示符中获取已经运行的 Windows 进程的控制台输出?将 StreamReader 定向到命令提示符

KDe*_*ker 7 c# windows process

我试图确定是否有办法通过 C# 在命令提示符下获取 Windows 环境中已运行进程的控制台输出。我已经通过 shell看到基于 linux 的系统的答案以及检索Process对象的方法。虽然两者都没有提供获得过程输出的解决方案。

我的代码我目前以这种方式找到一个进程(MongodDB 守护进程)

Process[] procs = Process.GetProcessesByName("mongod");
if (procs.Length > 0)
{
    MongoProcess = procs[0];
    Console.Out.WriteLine("Found mongod.exe, process id: " + MongoProcess.Id);
}
Run Code Online (Sandbox Code Playgroud)

我还找到了提供“可用于读取应用程序标准输出流的 StreamReader”的Process.StandardOutput属性有没有办法将此StreamReader输入定向到命令提示符输出?

我也知道我可以启动一个进程并显示命令提示符(进程输出),但这仅当进程“由我”启动时。

Process.Start(new ProcessStartInfo("notepad.exe") { CreateNoWindow = false })
Run Code Online (Sandbox Code Playgroud)

我也知道我可以简单地读取StreamReader并以我自己的方式显示输出,但我真的更喜欢只显示命令提示符。

Har*_*ton 8

Windows 不提供任何机制来追溯给另一个进程一个标准输出句柄,如果它是在没有创建的情况下创建的。(此外,在大多数情况下,应用程序只会在启动期间检查标准输出句柄。)

如果您知道(或可以成功猜测)特定应用程序如何生成输出,则原则上可以通过将您自己的代码注入进程来开始捕获该输出。例如,如果您知道该应用程序使用 C++ 并动态链接到 VS2015 运行时库,您可能会注入调用freopen 如下所示的代码。(在这种情况下,您必须知道应用程序使用哪个运行时库,因为您在查找 的地址时指定了它freopen。)

但是,代码注入并非微不足道,并且会产生无意中导致进程发生故障的风险。此外,任何已经产生的输出几乎肯定会被丢弃并且不可逆转地丢失。