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

时间:2020-05-11 20:19:49

标签: wql cim

我的应用程序中已经安装了Microsoft.Management.Infrastructure,至少在第一个示例代码中如此:

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

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

我一直在逐页阅读有关MMI,WQL和CIM以及大量其他TLA的文档,但是却不知道该怎么做

1)问一个问题:哪个进程打开或锁定了文件X?

2)枚举所有打开/锁定的文件,以便我可以查找文件X

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

1 个答案:

答案 0 :(得分:1)

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

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

Get-CimClass -PropertyName *handle*

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

您可能认为CIM_LogicalFile.InUseCount提供的功能与您所需的功能相似,但抱怨go as back as 2003无效。很有可能从未实现过。

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