代码之家  ›  专栏  ›  技术社区  ›  Betty Crokker

如何使用微软。管理。应用程序中的基础结构,用于确定哪个应用程序锁定了文件?

  •  0
  • Betty Crokker  · 技术社区  · 4 年前

    我有微软。管理。在我的应用程序中工作的基础设施,至少就第一个示例代码而言:

    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对我不起作用)。

    0 回复  |  直到 4 年前
        1
  •  1
  •   vers    4 年前

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

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

    Get-CimClass -PropertyName *handle*
    

    哪里 handle 是您感兴趣的房产名称。

    你可以认为 CIM_LogicalFile.InUseCount 提供与您所需类似的东西,但抱怨它不起作用 go as back as 2003 很有可能它从未得到实施。

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

    推荐文章