10

由于文件/进程监视器在记录时在过滤和不必要的重复方面不足,我想重新创建该程序的功能并实时记录所有 Windows 文件操作。

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

如何让 C# 从操作系统中提取此信息?


编辑:正如 zett42 指出的那样FileSystemWatcher,例如,从进程本身创建的文件事件不会被拦截。例如,这些事务都没有显示,即使我添加了事件:、、、Changed和,Created并将标志设置为 true 。RenamedDeletedFileSystemWatcherEnableRaisingEvents


编辑 2:使用 SimonMourier 对 Microsoft.Diagnostics.Tracing.TraceEvent nuget 包的建议,我设法敲出下面的代码。

这部分被放入一个后台工作者中:

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

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

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");
}

不幸的是,FileIOReadWriteTraceData.FileName没有拾取 Procmon 拾取的东西,例如(例如),非常常见的 Chrome 内容,例如写入C:\Users\Dan\AppData\Local\Google\Chrome\User Data\Default\Cookies-journalC:\Users\Dan\AppData\Local\Google\Chrome\User Data\Default\Current Session

4

2 回答 2

2

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

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

于 2020-02-11T18:51:51.687 回答
0

您是否尝试过使用 WMI?ManagementEventWatcher可以提供您需要的所有信息,即使它不如 FileSytemWatcher 方便。我不确定它是否会起作用,不幸的是目前无法亲自尝试,但这是我要开始的地方。

看看这个线程中 RRUZ 的答案,它完全符合您的要求。您只需要了解 WMI 是否提供了所有必需的信息。

于 2019-04-06T11:58:00.473 回答