c# - 如何在 C# 中记录低级操作系统文件事务?

标签 c# winapi interop file-monitoring procmon

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

我想记录时间、进程名、源路径、目的路径、操作、结果、详情等各种属性,如Process Monitor does .

我怎样才能让 C# 从操作系统中提取这些信息?


编辑:正如 zett42 所指出的,FileSystemWatcher 将无法正常工作,例如,从进程本身创建的文件事件将不会被拦截。例如,these transactions 都没有出现,即使我添加了事件:ChangedCreatedRenamedDeletedFileSystemWatcher 并将 EnableRaisingEvents 标志设置为 true。


编辑 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

最佳答案

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

另一种选择是让 Process Monitor 记录所有内容以归档并自行过滤事件。

关于c# - 如何在 C# 中记录低级操作系统文件事务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53872422/

相关文章:

c# - ReSharper 能否生成将属性从一个对象复制到另一个对象的代码?

c++ - 对话窗口内的子对话窗口

c# - 如何禁止因在 .NET 项目中使用 COM 引用而产生的编译器警告

c# - COM 异常 0x800A11F9 - 无法激活应用程序

c# - 将对象列表从 VB6 编码到 C#

c# - geckofx 的 Google 地球插件

c# - LinqToSQL 递归选择

c# - C# 中的 unsigned int mysql

c++ win32编辑框光标不闪烁

c# - 如何在 C# WinRT 组件中使用 List<T> 或 Dictionary<T,T2>