C# - 如何监视进程的文件读/写操作?

时间:2011-11-08 06:39:23

标签: c# file-io monitoring

我认为这可能是一个常见问题,但很难找到答案。我试过这里和其他论坛没有运气。

我正在编写一个C#(。net version 4)程序来监控进程。它已经在进程启动和停止时引发了一个事件,但我还需要检查这个进程从哪里读取和写入;特别写,因为我知道这个过程每次运行时都会写入大量数据。我们处理批量数据,并且进程写入的路径包含批处理ID,这是记录进程结果的重要信息。

我查看了System.Diagnostics.Process.BeginOutputReadLine方法,但由于文档说必须重定向StandardOutput,我不确定是否可以对当前正在运行的进程执行此操作,或者是否影响最初由进程预期的写操作。

它是C#中的控制台应用程序。如果有人知道如何做到这一点,将不胜感激。

提前致谢!

2 个答案:

答案 0 :(得分:1)

输出重定向只能帮助您解决拦截进程标准输出流的问题。这对程序将使用的其他文件或流的读/写操作没有影响。

最简单的方法是避免对此信息进行逆向工程,并对进程写入数据的位置施加一些控制(例如,将命令行参数传递给它以指定输出路径,并且您可以自己监视该输出路径)。

如果由于某种原因这是不可能的,你可以研究这些方法,所有方法都非常先进并且有各种缺点:

  • 使用Detours启动进程并将对CreateFile的调用重定向到您定义的函数(例如,您可以调用其他函数来跟踪它使用的文件名,然后调用真实的CreateFile)。请注意,使用Detours的许可证需要花钱,它需要您构建一个非托管DLL来定义您的替换功能。
  • Microsoft-Windows-Kernel-File事件跟踪提供程序中读取数据。此提供程序跟踪系统上所有内容的所有文件操作。如果您尝试从C#中使用此数据,则需要使用此ETW和许多P / Invoke调用的高级知识。
  • 一旦启动,枚举进程的打开句柄。 previous stackoverflow.com question有几种可能的解决方案。请注意,这不是万无一失的,因为它只会为您提供某个时间点活动的快照(例如,该过程可能会过快地打开和关闭句柄,以便您在枚举它们的调用之间进行观察)并且大多数答案都需要调用进入无证件的功能。

答案 1 :(得分:0)

我最近遇到了这个实现:DetectOpenFiles但我没有使用和/或测试它。随意试试吧。它似乎为给定的进程ID提供打开的文件句柄信息。期待阅读您的体验! ; - )