#c# #.net
Вопрос:
Как получить список дескрипторов открытых файлов по идентификатору процесса в C#?
Мне также интересно покопаться и узнать имена файлов.
Ищете программный эквивалент того, что делает process explorer.
Скорее всего, для этого потребуется взаимодействие.
Учитывая добавление вознаграждения за это, реализация довольно сложна.
Комментарии:
1. Для тех, кто наткнется на эту тему, ответ, предложенный @manuc66, в конечном итоге сработал на меня. НО доступная реализация здесь предназначена для платформы x86. Я разветвил репо и внес некоторые изменения, чтобы оно могло работать как на x86, так и на x64. Вы можете найти измененную реализацию здесь: https://github.com/urosjovanovic/MceController/blob/master/VmcServices/DetectOpenFiles.cs
Ответ №1:
Ой, это будет трудно сделать из управляемого кода.
Большую часть работы можно выполнить во взаимодействии, но вам нужен драйвер, чтобы получить имя файла, потому что оно находится в адресном пространстве ядра. Обозреватель процессов встраивает драйвер в свои ресурсы. Подключение всего этого к 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 — Просмотр открытых/заблокированных файлов в вашей системе (проблемы с нарушением общего доступа)