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

Sam*_*ron 40 .net c#

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

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

寻找程序化等价的进程资源管理器.

这很可能需要互操作.

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

Sam*_*ron 23

哎呀,托管代码很难做到这一点.

codeproject上有一个示例

大部分内容都可以在interop中完成,但是你需要一个驱动程序来获取文件名,因为它存在于内核的地址空间中.Process Explorer将驱动程序嵌入其资源中.从C#中获取这一切,并支持64位和32位,这将是一个令人头疼的问题.


Mar*_*ade 12

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

  • 为什么选择@bruce?有什么理由吗? (4认同)
  • 使用句柄的唯一真正问题是许可证 - 你不能分发句柄,甚至不能免费软件. (4认同)
  • 这是一个可怕的解决方案. (3认同)
  • 您可以自动下载。 (2认同)

Mar*_*ade 10

你可以P/INVOKE进入NtQuerySystemInformation函数来查询所有句柄,然后从那里开始.此Google小组讨论有详细信息.


man*_*c66 8

看看这个文件:http: //vmccontroller.codeplex.com/SourceControl/changeset/view/47386#195318

并使用:

DetectOpenFiles.GetOpenFilesEnumerator(processID);
Run Code Online (Sandbox Code Playgroud)

演示:

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

它依赖于汇编 System.EnterpriseServices