Как получить список дескрипторов открытых файлов по процессам в C#?
Как получить список открытых файловых дескрипторов по идентификатору процесса в C#?
Я заинтересован в копании и получении имен файлов.
Ищите программный эквивалент того, что делает проводник процессов.
Скорее всего это потребует взаимодействия.
Учитывая добавленную награду за это, реализация очень сложная.
7 ответов
Это будет трудно сделать из управляемого кода.
Большинство вещей может быть сделано во взаимодействии, но вам нужен драйвер, чтобы получить имя файла, потому что оно живет в адресном пространстве ядра. Process Explorer встраивает драйвер в свои ресурсы. Получение всего этого от C# и поддержка 64-битных, а также 32-х, будет большой головной болью.
Вы также можете запустить приложение командной строки Handle от Mark Rusinovich и проанализировать вывод.
Посмотрите на этот файл: http://vmccontroller.codeplex.com/SourceControl/changeset/view/47386
И использовать:
DetectOpenFiles.GetOpenFilesEnumerator(processID);
Демо-версия:
using System;
using System.Diagnostics;
namespace OpenFiles
{
class Program
{
static void Main(string[] args)
{
using (var openFiles = VmcController.Services.DetectOpenFiles.GetOpenFilesEnumerator(Process.GetCurrentProcess().Id))
{
while (openFiles.MoveNext())
{
Console.WriteLine(openFiles.Current);
}
}
Console.WriteLine();
Console.ReadKey();
}
}
}
Имеет зависимость от сборки System.EnterpriseServices
Вы можете P/INVOKE в NtQuerySystemInformation
функция для запроса всех дескрипторов, а затем перейти оттуда. Это обсуждение групп Google имеет детали.
Handle - отличная программа, а ссылка на codeproject - хорошая.
@Brian Причина кода в том, что handle.exe НЕ распространяется. И при этом они не выпускают их источник.
Похоже, что.Net будет нелегко сделать это, так как кажется, что для доступа к информации требуется диск встроенного устройства. Это не может быть сделано в.net без неуправляемой DLL. Это довольно глубокий код ядра по сравнению с типичным.net-кодированием. Я удивлен, что WMI не раскрывает это.
Взгляните на Process Hacker версии 1 от wj32, который может сделать то, что вы просили, и многое другое.
Возможно, используя инструмент командной строки:
OpenedFilesView v1.50 - Просмотр открытых / заблокированных файлов в вашей системе (проблемы с совместным использованием)