Как получить список дескрипторов открытых файлов по процессам в C#?

Как получить список открытых файловых дескрипторов по идентификатору процесса в C#?

Я заинтересован в копании и получении имен файлов.

Ищите программный эквивалент того, что делает проводник процессов.

Скорее всего это потребует взаимодействия.

Учитывая добавленную награду за это, реализация очень сложная.

7 ответов

Решение

Это будет трудно сделать из управляемого кода.

Есть пример на codeproject

Большинство вещей может быть сделано во взаимодействии, но вам нужен драйвер, чтобы получить имя файла, потому что оно живет в адресном пространстве ядра. 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 - Просмотр открытых / заблокированных файлов в вашей системе (проблемы с совместным использованием)

http://www.nirsoft.net/utils/opened_files_view.html

Другие вопросы по тегам