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