如何在C#中记录低级OS文件事务?

时间:2018-12-20 16:21:11

标签: c# winapi interop file-monitoring procmon

由于文件/进程监视器的过滤和unnecessary duplication when logging不足,我想重新创建该程序的功能并实时记录所有Windows文件操作。

我想记录各种属性,例如时间,进程名称,源路径,目标路径,操作,结果和详细信息,就像Process Monitor does一样。

如何获取C#来从OS中提取此信息?


编辑:正如zett42所指出的那样,FileSystemWatcher可能无法正常工作,例如,不会拦截从进程本身创建的文件事件。例如,即使我在{{1}中添加了事件ChangedCreatedRenamedDeletedthese transactions都没有出现}并将FileSystemWatcher标志设置为true。


编辑2:根据SimonMourier对Microsoft.Diagnostics.Tracing.TraceEvent nuget包的建议,我设法删除了下面的代码。

本节放到后台工作人员中:

EnableRaisingEvents

然后,创建的FileIOWrite事件在(自动)调用时运行以下命令:

Console.CancelKeyPress += (sender, e) => session.Stop();
session.EnableKernelProvider(KernelTraceEventParser.Keywords.All);
session.Source.Kernel.FileIOWrite += Kernel_FileIOWrite;            
session.Source.Process();

不幸的是,private void Kernel_FileIOWrite(Microsoft.Diagnostics.Tracing.Parsers.Kernel.FileIOReadWriteTraceData obj) { string filename = obj.FileName; string processpath = ""; if (obj.ProcessID == 0) processpath = "System Idle Process"; else if (obj.ProcessID == 4) processpath = "System"; else { try { processpath = "ID: " + obj.ProcessID + ": "+ Process.GetProcessById(obj.ProcessID).MainModule.FileName; } catch { processpath = "error ID: "+ obj.ProcessID; } } richTextBox1.AppendText(filename + " ............."+ processpath +"\n"); } 没有捡起Procmon捡到的东西,例如(很常见)的Chrome东西,例如写入FileIOReadWriteTraceData.FileNameC:\Users\Dan\AppData\Local\Google\Chrome\User Data\Default\Cookies-journal

2 个答案:

答案 0 :(得分:2)

您永远无法捕获Process Monitor在C#中捕获的所有内容。 ProcMon如此擅长捕获所有这些事情的原因之一是因为ProcMon包含一个以内核模式加载的驱动程序,该驱动程序会自行挂钩并侦听这些事件。如果要复制过程监视器,则必须编写自己的驱动程序以捕获所需的所有内容。 Windows驱动程序无法用C#编写,您将不得不用C / C ++编写驱动程序。

另一个选择是让Process Monitor将所有内容记录到文件中并自行过滤事件。

答案 1 :(得分:0)

您尝试使用WMI吗? ManagementEventWatcher可以提供您需要的所有信息,即使它不像FileSytemWatcher那样方便。 我不确定它是否可以正常工作,但不幸的是目前无法自己尝试,但这是我要开始的地方。

看看this thread中RRUZ的答案,它正是您想要的。您只需要确定WMI是否提供所有必需的信息即可。