2008-08-19 56 views
75

我最喜欢的Linux工具之一是lsof - 一把真正的瑞士军刀!如何确定Windows中是否打开特定文件?

今天,我发现自己想知道其中的WinXP系统上的程序有一个特殊的文件打开。是否有任何与lsof等效的工具?此外,有问题的文件是通过网络共享的,所以我不确定这是否会使问题变得复杂。

回答

61

使用Sysinternals Suite中的Process Explorer,Find Handle或DLL函数将让您搜索打开该文件的进程。

+0

这是否真的回答了这个问题? Process Explorer可以让你看到哪些文件对于特定的进程/句柄/ dll /什么是开放的,但这是反向映射。看到我的回答http://stackoverflow.com/questions/15708/lsof-equivalent-for-windows#188337这个问题。 – 2008-10-09 17:37:33

+5

是的。点击Find Handle或者Dll(或者点击Ctrl-F),输入你正在搜索的文件的名字,最后打开一个打开该文件的进程列表。 – 2008-10-10 00:07:33

+0

Process Explorer现在已重命名并捆绑到“Process Monitor”中。 – 2009-02-26 15:46:44

4

如果你的“电脑”(或“我的电脑”)的图标上单击鼠标右键,然后从弹出菜单中选择“管理”,即会带你到计算机管理控制台。

在那里,在系统工具\共享文件夹下,你会发现“打开文件”。这可能与您想要的接近,但如果文件位于网络共享上,那么您需要在文件所在的服务器上执行相同的操作。

+3

请注意,这只显示其他网络用户打开的共享文件。它无助于查找本地系统上打开的文件。在服务器上执行此操作可能会告诉您哪个用户打开了该文件,但不是该用户计算机上的哪个程序。 Process Explorer(如@JayHofacker提到的)对我来说效果很好。 – tomlogic 2012-02-27 21:45:10

8

尝试HandleFilemon & Regmon也非常适合弄清duce program foo对你的系统做什么。

+0

尝试过并喜欢把手。谢谢。 – Batandwa 2014-07-01 08:55:29

+0

@slipsec现在,在Windows 2000 SP4,Windows XP SP2或更高版本的Windows版本上,FileMon和Regmon将被[进程监视器v3.2](https://technet.microsoft.com/en-us/sysinternals/bb896645) Windows Server 2003 SP1和Windows Vista。 – Lucky 2015-08-17 09:35:38

5

尝试Unlocker

的解锁站点有一个漂亮的图表(以下链接后向下滚动),显示了相对于其他工具。显然,这样的比较通常是有偏见的,因为它们通常由工具作者编写,但图表至少列出了替代方案,以便您可以自己尝试。

36

lsof -p pid应的是组合输出Sysinternals公司的处理和listdlls的,即

handle -p pid 
listdlls -p pid 

你可以找到PID与Sysinternals的pslist

5

如果该文件是一个.dll,那么你可以使用任务列表命令行应用程序,看谁得到它打开:

TaskList /M nameof.dll 
2

使用Process Explorer中发现的进程ID。然后使用Handle找出哪些文件已打开。

如处理-p

我喜欢这种方法,因为你正在使用的实用程序从微软自身。

1

OpenedFilesView,在选项菜单下,有一个名为“显示网络文件”的菜单项。也许在启用后,上述实用程序有一定用处。

5

一个当量lsof的可以输出从Sysinternals的手柄listdlls的,即结合:

c:\SysInternals>handle 
[...] 
------------------------------------------------------------------------------ 
gvim.exe pid: 5380 FOO\alois.mahdal 
    10: File (RW-) C:\Windows 
    1C: File (RW-) D:\some\locked\path\OpenFile.txt 
[...] 

c:\SysInternals>listdlls 
[...] 
------------------------------------------------------------------------------ 
Listdlls.exe pid: 6840 
Command line: listdlls 

    Base  Size  Version   Path 
    0x00400000 0x29000 2.25.0000.0000 D:\opt\SysinternalsSuite\Listdlls.exe 
    0x76ed0000 0x180000 6.01.7601.17725 C:\Windows\SysWOW64\ntdll.dll 
[...] 

c:\SysInternals>listdlls 

不幸的是,你必须‘以管理员身份运行’,以能够使用它们。

另外listdlls的手柄不产生连续的台状形式,以便过滤的文件名会隐藏PID。 findstr /c:pid: /c:<filename>应该让你非常接近与这两个实用程序,虽然

c:\SysinternalsSuite>handle | findstr /c:pid: /c:Driver.pm 
System pid: 4 \<unable to open process> 
smss.exe pid: 308 NT AUTHORITY\SYSTEM 
avgrsa.exe pid: 384 NT AUTHORITY\SYSTEM 
[...] 
cmd.exe pid: 7140 FOO\alois.mahdal 
conhost.exe pid: 1212 FOO\alois.mahdal 
gvim.exe pid: 3408 FOO\alois.mahdal 
    188: File (RW-) D:\some\locked\path\OpenFile.txt 
taskmgr.exe pid: 6016 FOO\alois.mahdal 
[...] 

在这里,我们可以看到的gvim.exe是具有打开此文件的人。

3

有一个程序“OpenFiles”,似乎是Windows 7的一部分。似乎它可以做你想做的。它可以列出由远程用户打开的文件(通过文件共享),并在调用 “openfiles/Local on”并重启系统后,它应该能够显示本地打开的文件。据说后者有表现惩罚。

相关问题