【问题标题】:How to use Microsoft.Management.Infrastructure in an application to determine which app has a file locked?如何在应用程序中使用 Microsoft.Management.Infrastructure 来确定哪个应用程序已锁定文件?
【发布时间】:2020-05-11 20:19:49
【问题描述】:

我的应用程序中有 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 对我不起作用)。

【问题讨论】:

    标签: wql cim


    【解决方案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 通常能够完成的范围。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-19
      • 2016-07-15
      • 2015-09-15
      • 2013-08-13
      • 1970-01-01
      相关资源
      最近更新 更多