Как я могу регистрировать транзакции файлов низкого уровня ОС в C#?
Поскольку File/Process Monitor терпит неудачу с точки зрения фильтрации и ненужного дублирования при ведении журнала, я хочу воссоздать то, что делает эта программа, и записывать все операции с файлами Windows в реальном времени.
Я хочу записать различные атрибуты, такие как время, имя процесса, исходный путь, целевой путь, операция, результат и детали, как это делает Process Monitor.
Как я могу получить C# для извлечения этой информации из ОС?
РЕДАКТИРОВАТЬ: Как указал zett42, FileSystemWatcher
не будет работать, как, например, файловые события, созданные самими процессами, не будут перехвачены. Например, ни одна из этих транзакций не отображается, хотя я добавил события: Changed
, Created
, Renamed
, а также Deleted
к FileSystemWatcher
и установить EnableRaisingEvents
признак истины
РЕДАКТИРОВАТЬ 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
0 ответов
Вы никогда не сможете захватить все, что фиксирует Process Monitor на C#. Одна из причин, по которой ProcMon так хорош в захвате всех этих вещей, заключается в том, что ProcMon содержит драйвер, который загружается в режиме ядра, перехватывает себя и прослушивает эти события. Если вы хотите реплицировать монитор процесса, вам придется написать собственный драйвер, чтобы фиксировать все, что вы хотите. Драйвер Windows нельзя написать на C#, и вам придется писать драйвер на C/C++.
Другой вариант - заставить Process Monitor записывать все в файл и самостоятельно фильтровать события.
Вы пытались использовать WMI? ManagementEventWatcher может предоставить всю необходимую информацию, даже если он не так удобен, как FileSytemWatcher. Я не уверен, что это сработает, и, к сожалению, сейчас не могу попробовать это сам, но с этого момента и начну.
Взгляните на ответ RRUZ в этой теме, который делает именно то, что вы хотите. Вам просто нужно выяснить, предоставляет ли WMI всю необходимую информацию.