如何通过C#中的进程ID获取打开文件句柄列表?
我有兴趣挖掘并获取文件名.
寻找程序化等价的进程资源管理器.
这很可能需要互操作.
考虑到在此上添加赏金,实现是非常复杂的.
哎呀,托管代码很难做到这一点.
codeproject上有一个示例
大部分内容都可以在interop中完成,但是你需要一个驱动程序来获取文件名,因为它存在于内核的地址空间中.Process Explorer将驱动程序嵌入其资源中.从C#中获取这一切,并支持64位和32位,这将是一个令人头疼的问题.
您还可以运行Mark Rusinovich 的命令行应用程序Handle,并解析输出.
你可以P/INVOKE进入NtQuerySystemInformation
函数来查询所有句柄,然后从那里开始.此Google小组讨论有详细信息.
看看这个文件:http: //vmccontroller.codeplex.com/SourceControl/changeset/view/47386#195318
并使用:
DetectOpenFiles.GetOpenFilesEnumerator(processID);
演示:
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(); } } }
它依赖于汇编 System.EnterpriseServices