如何通过C#中的进程ID获取打开文件句柄列表?
我有兴趣挖掘并获取文件名。
寻找程序化等效的流程资源管理器。
这很可能需要互操作。
考虑到在此上添加赏金,实施是非常复杂的。
答案 0 :(得分:23)
这对托管代码来说很难做到。
大部分内容都可以在interop中完成,但是你需要一个驱动程序来获取文件名,因为它存在于内核的地址空间中。 Process Explorer将驱动程序嵌入其资源中。从C#中获取这一切,并支持64位和32位,这将是一个令人头疼的问题。
答案 1 :(得分:12)
您还可以运行Mark Rusinovich的命令行应用程序Handle,并解析输出。
答案 2 :(得分:10)
您可以P / INVOKE进入NtQuerySystemInformation
函数来查询所有句柄,然后从那里开始。这个Google groups discussion有详细信息。
答案 3 :(得分:8)
看看这个文件: 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
答案 4 :(得分:2)
Handle是一个很棒的程序,并且代码项目的链接很好。
@布赖恩 代码的原因是handle.exe不可再发行。他们也没有释放他们的来源。
看起来.Net似乎不会轻易做到这一点,因为看起来需要嵌入式设备驱动器来访问信息。如果没有未管理的DLL,则无法在.net中完成此操作。与典型的.net编码相比,它是相当深的内核代码。我很惊讶WMI没有透露这一点。
答案 5 :(得分:1)
也许使用命令行工具:
OpenedFilesView v1.50 - 查看系统中已打开/锁定的文件(共享违规问题)
答案 6 :(得分:1)
看看wj32的Process Hacker version 1,它可以做你所要求的,等等。