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

时间:2008-10-07 03:37:24

标签: c# .net

如何通过C#中的进程ID获取打开文件句柄列表?

我有兴趣挖掘并获取文件名。

寻找程序化等效的流程资源管理器。

这很可能需要互操作。

考虑到在此上添加赏金,实施是非常复杂的。

7 个答案:

答案 0 :(得分:23)

这对托管代码来说很难做到。

有一个sample on codeproject

大部分内容都可以在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 - 查看系统中已打开/锁定的文件(共享违规问题)

http://www.nirsoft.net/utils/opened_files_view.html

答案 6 :(得分:1)

看看wj32的Process Hacker version 1,它可以做你所要求的,等等。