Как я могу регистрировать транзакции файлов низкого уровня ОС в C #? - PullRequest
0 голосов
/ 20 декабря 2018

Поскольку File / Process Monitor терпит неудачу с точки зрения фильтрации и ненужного дублирования при ведении журнала , я хочу воссоздать то, что делает эта программа, и записывать все операции с файлами Windows в реальном времени.

Я хочу записать различные атрибуты, такие как время, имя процесса, исходный путь, целевой путь, операция, результат и детали, точно так же, как Process Monitor делает .

Как я могу получить C #извлечь эту информацию из ОС?


РЕДАКТИРОВАТЬ: Как указал zett42, FileSystemWatcher не будет работать, как, например, файловые события, созданные из самих процессов, не будут перехватываться.Например, ни одна из этих транзакций не отображается, хотя я добавил события: Changed, Created, Renamed и Deleted в FileSystemWatcher и установил EnableRaisingEventsустановить значение true.


РЕДАКТИРОВАТЬ 2: Используя предложение SimonMourier для пакета nuget Microsoft.Diagnostics.Tracing.TraceEvent, мне удалось добавить код ниже.

Этот раздел помещенв фоновый рабочий:

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-journal или C:\Users\Dan\AppData\Local\Google\Chrome\User Data\Default\Current Session

1 Ответ

0 голосов
/ 06 апреля 2019

Вы пытались использовать WMI? ManagementEventWatcher может предоставить всю необходимую информацию, даже если он не так удобен, как FileSytemWatcher.Я не уверен, что это сработает, и, к сожалению, в данный момент я не могу попробовать это сам, но с этого я и начал бы.

Взгляните на ответ RRUZ в этой теме , который делает именно то, что вы хотите.Вам просто нужно выяснить, предоставляет ли WMI всю необходимую информацию.

...