10

File/Process Monitor はフィルタリングとロギング時の不必要な複製の点で不十分なので、そのプログラムが行うことを再現し、すべての Windows ファイル操作をリアルタイムで記録したいと考えています。

Process Monitorと同じように、時間、プロセス名、ソース パス、宛先パス、操作、結果、詳細などのさまざまな属性を記録したいと考えています。

C# でこの情報を OS から抽出するにはどうすればよいですか?


編集: zett42 が指摘したように、FileSystemWatcherプロセス自体から作成されたファイル イベントは傍受されないなど、まったく機能しません。たとえば、 、、、およびのイベントを に追加し、フラグを trueに設定しても、これらのトランザクションは表示されません。ChangedCreatedRenamedDeletedFileSystemWatcherEnableRaisingEvents


編集 2: Microsoft.Diagnostics.Tracing.TraceEvent nuget パッケージに関する SimonMourier の提案を使用して、以下のコードをノックアップすることができました。

このセクションは、バックグラウンド ワーカーに配置されます。

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.FileNameProcmon がピックアップするもの (たとえば) をピックアップしていません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