如何在C#中按进程获取打开的文件句柄列表?

如何在C#中按进程获取打开的文件句柄列表?,c#,.net,C#,.net,如何在C#中按进程id获取打开的文件句柄列表 我对深入挖掘和获取文件名感兴趣 寻找process explorer所做的编程等价物 这很可能需要互操作 考虑在此基础上添加悬赏,实现非常复杂。您可以在函数中p/INVOKE查询所有句柄,然后从那里开始。这有很多细节。哎哟,这在托管代码中很难做到 有一个 大部分工作都可以在互操作中完成,但是您需要一个驱动程序来获取文件名,因为它位于内核的地址空间中。Process Explorer将驱动程序嵌入其资源中。从C#连接到这一切,支持64位和32位,这将是

如何在C#中按进程id获取打开的文件句柄列表

我对深入挖掘和获取文件名感兴趣

寻找process explorer所做的编程等价物

这很可能需要互操作


考虑在此基础上添加悬赏,实现非常复杂。

您可以在函数中p/INVOKE查询所有句柄,然后从那里开始。这有很多细节。

哎哟,这在托管代码中很难做到

有一个


大部分工作都可以在互操作中完成,但是您需要一个驱动程序来获取文件名,因为它位于内核的地址空间中。Process Explorer将驱动程序嵌入其资源中。从C#连接到这一切,支持64位和32位,这将是一个非常头痛的问题

您还可以运行Mark Rusinovich编写的命令行应用程序,并解析输出。

Handle是一个很棒的程序,指向codeproject的链接也不错

@布莱恩 产生该代码的原因是handle.exe不可再发行。他们也没有释放他们的源头


似乎.Net不会轻易做到这一点,因为似乎需要嵌入式设备驱动器来访问信息。如果没有未管理的DLL,则无法在.net中执行此操作。与典型的.net编码相比,它是相对深入的内核代码。我很惊讶WMI没有公开这一点。

可能使用命令行工具:

OpenedFileView v1.50-查看系统中打开/锁定的文件(共享冲突问题)


查看此文件:

和使用:

DetectOpenFiles.GetOpenFilesEnumerator(processID);
演示:


它依赖于汇编
系统。EnterpriseServices

看看wj32,它可以满足您的要求,还有更多功能。

好东西。我看看能不能让互操作开始谁在乎代码,那东西很有用!甚至比过程资源管理器好,因为它是什么。这不是一个在托管代码中很容易的东西,如果我必须用这样的代码来构建一个C++程序,那么我可能会简单地把它打包成一个C++程序。对于那些偶然发现这个线程的人来说,@ MANUC66提出的答案最终为我工作。但是,可用的实现是针对x86平台的。我已经对回购协议进行了分叉,并进行了一些调整,以便它可以在x86和x64上运行。您可以在这里找到修改后的实现:Why@bruce?有什么原因吗?使用handle的唯一真正问题是许可证-你不能分发handle,即使在免费软件中也不行。handle.exe是一个32位的应用程序,不是吗?因此,您无法从64位C应用程序轻松启动它。按照前面提到的GetOpenFilesEnumerator运行它会返回一个包含两个成员的对象:
错误访问被拒绝,错误无效参数被测试,此代码工作正常。也许你实际上没有访问权限。知道“EventTrackingEnabledAttribute”或“ServicedComponent”需要什么程序集吗?@MacGyver System.eEnterpriseServicesVMController已不在System.EnterpriseServices中,我无法编译它。我需要包括这个文件。感谢Gert Jan Niewenhuijse,这显然是作为Microsoft Visual Media Controoer的一个附带项目开始的。我用它来关闭don office文件,这些文件在关闭后保持打开状态,但不会被忘记。
using System;
using System.Diagnostics;

namespace OpenFiles
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var openFiles = VmcController.Services.DetectOpenFiles.GetOpenFilesEnumerator(Process.GetCurrentProcess().Id))
            {
                while (openFiles.MoveNext())
                {
                    Console.WriteLine(openFiles.Current);
                }
            }
            Console.WriteLine();
            Console.ReadKey();
        }
    }
}