c# -如何监控进程'文件读写操作

本文关键字:进程 操作 文件读写 监控 何监控 | 更新日期: 2023-09-27 18:14:01

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

我正在写一个c# (.net版本4)程序来监视进程。当进程开始和停止时,它已经引发了一个事件,但我还需要检查这个进程从哪里读取和写入;因为我知道这个进程每次运行时都会写入大量的数据。我们处理成批数据,进程写入的路径包含Batch ID,这是记录进程结果的重要信息。

我已经研究了System.Diagnostics.Process.BeginOutputReadLine方法,但是由于文档说StandardOutput必须重定向,我不确定这是否可以在当前正在运行的进程上完成,或者它是否影响了进程最初打算的写操作。

它是c#中的一个控制台应用程序。如果有人对如何做到这一点有任何想法,将不胜感激。

提前感谢!

c# -如何监控进程'文件读写操作

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

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

如果由于某种原因这是不可能的,你可以看看这些方法,它们都是相当先进的,有各种各样的缺点:

  • 使用Detours启动进程并将对CreateFile的调用重定向到您定义的函数(例如,您可以调用其他函数来跟踪它使用的文件名,然后调用真正的CreateFile)。请注意,使用Detours的许可证需要花钱,并且需要您构建一个非托管DLL来定义您的替换函数。
  • Microsoft-Windows-Kernel-File事件跟踪提供程序读取数据。该提供程序跟踪系统上所有文件操作。使用这些数据需要高级的ETW知识和大量的P/Invoke调用,如果你试图从c#中使用它。
  • 在进程启动时枚举进程的打开句柄。之前stackoverflow.com上的一个问题有几个可能的解决方案。请注意,这不是万无一失的,因为它只给你在某个时间点的活动快照(例如,进程可能打开和关闭句柄太快,以至于你无法在调用之间观察到它以枚举它们),并且大多数这些答案需要调用未记录的函数。

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