Страницы

Поиск по вопросам

среда, 26 февраля 2020 г.

Можно ли узнать работает ли сторонняя программа с данной директорией?

#c_sharp #net #windows


Предположим, есть какой-то сторонний и древний софт без какого-либо API для взаимодействия,
которому на вход подается некоторые директории с файлами и он их колбасит считывая
какие-то метрики без изменения самих файлов.

Так вот, можно ли как-то из своей программы пасти ее и понять над какой директорией
она выполняет операции чтения?

Интересует возможность получения такой информации, как в сценариях когда программа
колбасит папку на локальном ПК, так и тогда когда программа работает с ресурсом на
файловой шаре.
    


Ответы

Ответ 1



Есть такая мощная технология: Event Tracing for Windows (ETW). Она может собирать огромное количество всевозможных событий. Проблема разобраться в этих событиях... Я попробовал поразбираться. Создаём консольное приложение (.NET FW 4.7). Устанавливаем nuget-пакет Microsoft.Diagnostics.Tracing.TraceEvent. Технология требует прав администратора. Поэтому добавляем в проект манифест и пишем в нём строку: Код: using System; using Microsoft.Diagnostics.Tracing.Parsers; using Microsoft.Diagnostics.Tracing.Parsers.Kernel; using Microsoft.Diagnostics.Tracing.Session; namespace ConAppETW { class Program { static void Main() { // create a real time user mode session using (var session = new TraceEventSession("Test")) { // Set up Ctrl-C to stop the session Console.CancelKeyPress += (object s, ConsoleCancelEventArgs args) => session.Stop(); // Turn on the process events (includes starts and stops ) session.EnableKernelProvider(KernelTraceEventParser.Keywords.DiskFileIO | KernelTraceEventParser.Keywords.FileIOInit | KernelTraceEventParser.Keywords.FileIO); // Subscribe to a callback that prints the information we wish session.Source.Kernel.FileIOCreate += Kernel_FileIOCreate; session.Source.Process(); // Listen (forever) for events } } } private static void Kernel_FileIOCreate(FileIOCreateTraceData data) { if (data.ToString().Contains(@"C:\Test\")) Console.WriteLine(data); } } } При запуске даём согласие UAC. Keywords - это то, что мы хотим отслеживать. Не уверен, правильный ли это набор. FileIOCreate - событие, которое будем отслеживать. Это не создание файла, а вообще любые события с ним, как я понял. Пробовал также FileIORead, но что-то не зашло... В обработчике события (а их будет очень много) фильтруем нужные нам. Я сделал просто проверку на путь к искомой папке. Если в этой папке, например, открыть текстовый файлик блокнотом, то события появляются. Это лишь набросок. Если кто-то получше въедет в тему (есть желающие?), то я с готовностью поставлю плюсик и вообще на основе хорошего сообщения можно будет сделать ответ-закрывашку.

Комментариев нет:

Отправить комментарий