Windows - 无法强制关闭网络文件句柄 - 无法关闭系统(Pid 4)文件句柄。

8
首先,很抱歉这个问题有点长,但我想提供足够的细节。
概要:
在Windows中,好像无法强制关闭通过网络共享打开的文件句柄。因此,在通过网络共享打开的文件不能被移动/重命名/删除。我使用的是Win7。
问题:
有人能看出我做错了什么吗?或者能否确认这是预期的行为,并且不能强制关闭系统文件句柄(始终在pid 4上,例如与文件的网络共享访问相关的那些)。
背景:
我们有远程网络客户端用户访问一个日志文件。我们需要滚动日志文件,以便它不会变得太大。由于该文件正在使用,我们无法滚动日志文件。
重现问题:
0)以管理员身份执行所有操作
1)创建新目录并共享它
2)在新目录中创建一个文件
3)通过文件共享使用类似MS Word的东西来编辑文件,这样做 tends 可以获得文件锁定。因此,要模拟远程用户/主机锁定文件,请执行 Start / Run,然后键入\ YourHostName,然后选择您创建的文件共享,然后导航到文件并使用Word编辑它。
4)列出打开的文件句柄,我们可以看到下面有2个
handle C:\Log\MyLockedFile.txt
Handle v3.46 Copyright(C)1997-2011 Mark Russinovich Sysinternals - www.sysinternals.com
System pid:4 type:File 3E64:C:\Log\MyLockedFile.txt System pid:4 type:File 5E48:C:\Log\MyLockedFile.txt
5)尝试关闭文件句柄,这里我们看到尝试关闭失败。
handle -c 3E64 -p 4
Handle v3.46 Copyright(C)1997-2011 Mark Russinovich Sysinternals - www.sysinternals.com
3E64:File(R--)C:\Log\MyLockedFile.txt 在系统中关闭句柄3E64(PID 4)?(是/否)y 错误关闭处理: 该句柄无效。
6)列出网络文件句柄,这里我们可以看到打开的网络共享到文件。
openfiles /query -v
INFO:需要启用系统全局标志“维护对象列表”才能查看本地已打开的文件。 有关更多信息,请参见Openfiles /?

主机名 ID 访问者 类型 #锁定数 打开模式 打开文件 (路径\可执行文件) 14693W7N 67109233 myuser1 Windows 0 写入 + 读取 C:\Log\MyLockedFile.txt 14693W7N 495 myuser1 Windows 0 读取 C:\Log\

7)

关闭/断开与文件的句柄连接,这里似乎可以工作

C:>openfiles /disconnect /a * /OP C:\Log\MyLockedFile.txt

SUCCESS: 已终止与打开文件 "C:\Log\MyLockedFile.txt" 的连接。

8)

尝试删除后,系统文件句柄仍然处于活动状态。

C:>handle C:\Log\MyLockedFile.txt

Handle v3.46 Copyright (C) 1997-2011 Mark Russinovich Sysinternals - www.sysinternals.com

System pid: 4 type: File 3E64: C:\Log\MyLockedFile.txt

9)

由于文件仍在使用中,因此无法移动/重命名文件。

C:>move C:\Log\MyLockedFile.txt C:\Log\MyLockedFile.txt.newName The process cannot access the file because it is being used by another process. 0 file(s) moved.


4
你的做法有误。你需要使用的函数是NetFileClose - Raymond Chen
肯定已经有一些小工具可以做到这一点了吧?我宁愿不自己编写一个调用NetFileClose的小型C++应用程序,更不想使用PowerShell来访问它。 - thekbb
如果关闭随机内核句柄,你的系统很可能在一段时间后表现不稳定。句柄值会被重用,并且创建句柄的原始组件将继续使用该数值。在某个随机进程中关闭句柄则(启发式地)更为安全。 - usr
1
PsFile可以做到这一点:https://learn.microsoft.com/en-us/sysinternals/downloads/psfile - Gregor Slavec
1个回答

4

我将这条回答发布出来,因为看到了这个没有任何答案的问题(嘿,恰好一年?)

首先,在这里有一个关于这个话题的非常有趣的讨论(关于NTFS,我想)。如果你阅读上面的链接,你可以得到一些关于为什么某些句柄似乎会永远“挂起”,以及为什么“强制关闭”不是一个很好的想法的提示。

"handle -c" 无效的句柄错误可能与在本地和远程运行 "handle" 有关,即在物理连接网络驱动器的机器上运行 "handle" (?)

对于我的目的,在我的场景中,我最终远程强制关闭了一个句柄(只是因为我想用 Sysinternals 工具快速而粗略地关闭它 - 使用你提到的 "psexec" 和 "handle"(不需要指定用户和密码,因为我以管理员身份登录,我猜):

rem To list the open handles
psexec \\someserver -c handle /accepteula some_filename

rem To force close a particular handle
psexec \\someserver -c handle /accepteula -c 3F9C -p 4

但是,在远程运行handle命令时并没有给出任何结果(没有打开的句柄),我尝试删除的文件夹仍然被锁定。经过一段时间后(我还尝试使用“net use f:/delete”断开与相关网络共享的连接,但未成功,因为它“正在被活动进程访问”) - 我发现我的本地计算机仍然保留有对该目录的打开句柄 - 实际上,我强制远程关闭的句柄来自我的本地计算机。我使用Process Explorer GUI毫不费力地关闭了它们,这应该相当于从命令提示符使用“handle”。此后,相关文件夹便可被删除。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接