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

#c# #.net

Вопрос:

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

Мне также интересно покопаться и узнать имена файлов.

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

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

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

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

1. Для тех, кто наткнется на эту тему, ответ, предложенный @manuc66, в конечном итоге сработал на меня. НО доступная реализация здесь предназначена для платформы x86. Я разветвил репо и внес некоторые изменения, чтобы оно могло работать как на x86, так и на x64. Вы можете найти измененную реализацию здесь: https://github.com/urosjovanovic/MceController/blob/master/VmcServices/DetectOpenFiles.cs

Ответ №1:

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

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

Большую часть работы можно выполнить во взаимодействии, но вам нужен драйвер, чтобы получить имя файла, потому что оно находится в адресном пространстве ядра. Обозреватель процессов встраивает драйвер в свои ресурсы. Подключение всего этого к C# и поддержка 64-битной, а также 32-битной версии станет серьезной головной болью.

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

1. Кого волнует код, эта штука полезна! Даже лучше, чем Process Explorer, для того, что он делает.

2. это не то, что легко в управляемом коде, я бы, вероятно, просто выложил программу на c , если бы мне пришлось создавать что-то подобное @Kiquenet

Ответ №2:

Вы также можете запустить приложение командной строки «Дескриптор» Марка Русиновича и проанализировать выходные данные.

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

1. Почему @Брюс ? пожалуйста, есть какие-нибудь причины?

2. Единственная реальная проблема с использованием handle — это лицензия-вы не можете распространять handle даже в бесплатной версии.

3. Handle.exe это 32-битное приложение, не так ли? Таким образом, вы не можете легко запустить его из 64-битного приложения C#.

4. Есть Handle64.exe также @seveves

Ответ №3:

Взгляните на этот файл : http://vmccontroller.codeplex.com/SourceControl/changeset/view/47386#195318

И использовать:

 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

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

1. Запустив его, как вы упомянули, GetOpenFilesEnumerator возвращает объект с 2 элементами:<br>ERROR_ACCESS_DENIED и ERROR_INVALID_PARAMETERS

2. Только что протестирован, и этот код работает нормально. может быть, у вас на самом деле нет доступа.

3. Есть идеи, какая сборка требуется для «EventTrackingEnabledAttribute» или «ServicedComponent»?

4. Система @MacGyver. Предприятия-поставщики услуг

5. VmcController больше не находится в системе. EnterpriseServices и я не смогли заставить это скомпилировать. Мне нужно было включить этот файл github.com/gjniewenhuijse/MceController/blob/master/VmcServices/. … Благодаря Герт-Яну Невенхуйсе, это, по-видимому, началось как побочный проект для Microsoft Visual Media Controoer. Я использую его, чтобы закрыть офисные файлы, которые остаются открытыми после того, как они закрыты, но не забыты.

Ответ №4:

Вы можете P/ВЫЗВАТЬ NtQuerySystemInformation функцию, чтобы запросить все дескрипторы, а затем перейти оттуда. В этом обсуждении в группах Google есть подробности.

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

1. Хорошая штука. Я посмотрю, смогу ли я наладить взаимодействие

Ответ №5:

Взгляните на wj32 Process Hacker версии 1, который может делать то, что вы просили, и многое другое.

Ответ №6:

Handle-отличная программа, и ссылка на codeproject хорошая.

@Брайан Причина кода в том, что handle.exe НЕ подлежит распространению. Они также не раскрывают свой источник.

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

Ответ №7:

Возможно, с помощью инструмента командной строки:

OpenedFilesView v1.50 — Просмотр открытых/заблокированных файлов в вашей системе (проблемы с нарушением общего доступа)

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