Как использовать Microsoft.Management.Infrastructure в приложении, чтобы определить, в каком приложении заблокирован файл?

У меня есть Microsoft.Management.Infrastructure, работающая в моем приложении, по крайней мере, до самого первого примера кода:

CimSession.Create(null)
    .QueryInstances(@"root\cimv2", "WQL", "SELECT * FROM Win32_OperatingSystem")
    .FirstOrDefault().CimInstanceProperties["Version"].Value.ToString();

Что мне нужно, так это использовать MMI, чтобы определить, блокируют ли какие-либо приложения на локальном компьютере определенный файл (см. a-memorymappedfile-is-in-use-c-net-core">этот вопрос, чтобы понять, почему подходы, отличные от MMI, не работают)

Я читал страницу за страницей документации по MMI, WQL, CIM и множеству других TLA, но не могу понять, как

1) задать вопрос "в каком процессе файл X открыт/заблокирован"?

or

2) перечислить все открытые/заблокированные файлы, чтобы я мог найти файл X

Важно - мне нужно сделать это в коде (запуск Process Explorer мне не подойдет).


person Betty Crokker    schedule 11.05.2020    source источник


Ответы (1)


Насколько я знаю, это невозможно сделать в CIM/WMI.

Если у вас есть время, вы можете просмотреть около 1400 доступных классов CIM/WMI с помощью такого инструмента, как Проводник WMI. Или вы можете ограничить свой поиск, просматривая только классы, содержащие определенные имена свойств, запустив что-то вроде этого в PowerShell:

Get-CimClass -PropertyName *handle*

где handle — имя интересующего вас свойства.

Вы можете подумать, что файл CIM_LogicalFile.InUseCount предоставляет что-то похожее на что вам нужно, но жалобы на то, что это не работает, поступают как еще в 2003 году. Вполне возможно, что он так и не был реализован.

В качестве примечания: кажется, что большинство авторов инструментов «разблокировки файлов» исходят из предположения, что заблокированный файл означает, что существует дескриптор файла, принадлежащий процессу, поэтому вам просто нужно перечислить все активные дескрипторы файлов и сопоставить их с дескриптором файла. список запущенных процессов. К сожалению, в WMI нет класса, который позволяет вам это сделать, но даже если бы такой класс был, он не работал бы для файлов с отображением памяти (что, судя по вашему другому вопросу, вас интересует), потому что большинство приложения удаляют дескриптор файла, как только открывают файл с отображением в памяти. Чтобы получить эту информацию, вам нужно будет перечислить области виртуальной памяти в процессе, а затем запросить диспетчер памяти Windows, чтобы узнать, какой образ или отображаемый в памяти файл соответствует этой области. Такая задача кажется довольно далекой от того, что WMI обычно может делать.

person Alexey Mitev    schedule 17.05.2020