由于文件/进程监视器的过滤和unnecessary duplication when logging不足,我想重新创建该程序的功能并实时记录所有Windows文件操作。
我想记录各种属性,例如时间,进程名称,源路径,目标路径,操作,结果和详细信息,就像Process Monitor does一样。
如何获取C#来从OS中提取此信息?
编辑:正如zett42所指出的那样,FileSystemWatcher
可能无法正常工作,例如,不会拦截从进程本身创建的文件事件。例如,即使我在{{1}中添加了事件Changed
,Created
,Renamed
和Deleted
,these 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.FileName
或C:\Users\Dan\AppData\Local\Google\Chrome\User Data\Default\Cookies-journal
答案 0 :(得分:2)
您永远无法捕获Process Monitor在C#中捕获的所有内容。 ProcMon如此擅长捕获所有这些事情的原因之一是因为ProcMon包含一个以内核模式加载的驱动程序,该驱动程序会自行挂钩并侦听这些事件。如果要复制过程监视器,则必须编写自己的驱动程序以捕获所需的所有内容。 Windows驱动程序无法用C#编写,您将不得不用C / C ++编写驱动程序。
另一个选择是让Process Monitor将所有内容记录到文件中并自行过滤事件。
答案 1 :(得分:0)
您尝试使用WMI吗? ManagementEventWatcher可以提供您需要的所有信息,即使它不像FileSytemWatcher那样方便。 我不确定它是否可以正常工作,但不幸的是目前无法自己尝试,但这是我要开始的地方。
看看this thread中RRUZ的答案,它正是您想要的。您只需要确定WMI是否提供所有必需的信息即可。