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



我正在尝试确定是否有办法通过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);
}

我还找到了Process.StandardOutput属性,该属性提供了"可用于读取应用程序的标准输出流的StreamReader"。是否有方法将此StreamReader输入引导到命令提示符输出

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

Process.Start(new ProcessStartInfo("notepad.exe") { CreateNoWindow = false })

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

Windows不提供任何机制,如果创建另一个进程时没有标准输出句柄,则可以追溯地为其提供标准输出句柄。(此外,在大多数情况下,应用程序只会在启动时检查标准输出句柄。)

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

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

最新更新