如何在应用程序中使用 Microsoft.Management.Infrastructure 来确定哪个应用程序锁定了文件?

How to use Microsoft.Management.Infrastructure in an application to determine which app has a file locked?

我的应用程序中有 Microsoft.Management.Infrastructure,至少就第一个示例代码而言:

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

我需要的是使用 MMI 来确定本地计算机上的任何应用程序是否锁定了特定文件(请参阅 了解为什么 MMI 之外的方法不起作用)

我一直在逐页阅读有关 MMI、WQL 和 CIM 以及大量其他 TLA 的文档,但无法弄清楚如何

1) 提出问题 "which process has file X open/locked"?

2) 枚举所有 open/locked 文件以便我可以查找文件 X

重要 - 我需要在代码中执行此操作(运行 Process Explorer 对我不起作用)。

据我所知,在 CIM/WMI 中是不可能的。

如果有时间,您可以在 WMI Explorer 等工具中检查 ~1400 个可用的 CIM/WMI classes。或者您可以通过 运行 仅查看包含某些 属性 名称的 class 来限制您的搜索,在 PowerShell 中类似这样:

Get-CimClass -PropertyName *handle*

其中 handle 是您感兴趣的 属性 名称。

你可以认为 CIM_LogicalFile.InUseCount provides something similar to what you need but the complaints that it doesn't work go as back as 2003。它很可能从未实施过。

作为旁注,似乎大多数 "file unlocker" 工具的作者都假设锁定的文件意味着进程拥有一个文件句柄,因此您只需要枚举所有活动文件处理并将它们与 运行 进程列表相关联。不幸的是,WMI 中没有 class 允许您这样做,但即使有这样的 class,它也不适用于内存映射文件(根据您的其他问题判断是你关心的是什么)因为大多数应用程序在打开内存映射文件后会立即处理文件句柄。为了获得该信息,您需要枚举进程中的虚拟内存区域,然后查询 Windows 内存管理器,询问哪个图像或内存映射文件对应于该区域。像这样的任务感觉远远超出了 WMI 通常能够完成的范围。