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

时间:2012-05-28 06:32:17

标签: windows

首先,对于长期问题感到抱歉,但我想提供足够的细节。

梗概:

在Windows中似乎无法强制关闭通过网络共享打开的文件句柄。因此,无法移动/重命名/删除通过网络共享打开的文件。我正在使用Win 7。

问题:

任何人都可以看到我做错了或者有人确认这是预期的,并且不可能强制关闭系统文件句柄(总是在pid 4上,例如与网络共享访问文件相关的那些)。

背景:

我们有访问日志文件的远程网络客户端用户。我们需要滚动日志文件,使其不会变得太大。我们无法滚动日志文件,因为文件报告为正在使用。

重新创建问题:

0)

以管理员身份执行所有操作

1)

创建一个新目录并分享

2)

在新目录中创建一个文件

3)

通过文件共享编辑文件,其中的内容往往会像MS Word一样获得文件锁定。所以,开始/运行然后键入\ YourHostName然后选择您创建的文件共享,然后导航到该文件并使用Word进行编辑。这是为了模拟锁定文件的远程用户/主机。

4)

列出打开的文件句柄,我们可以看到下面的2

C:>处理C:\ Log \ MyLockedFile.txt

处理第3.56节 版权所有(C)1997-2011 Mark Russinovich Sysinternals - www.sysinternals.com

系统pid:4类型:文件3E64:C:\ Log \ MyLockedFile.txt 系统pid:4类型:文件5E48:C:\ Log \ MyLockedFile.txt

5)

尝试关闭文件句柄,在这里我们看到尝试关闭失败。

C:> handle -c 3E64 -p 4

处理第3.56节 版权所有(C)1997-2011 Mark Russinovich Sysinternals - www.sysinternals.com

3E64:文件(R--)C:\ Log \ MyLockedFile.txt 关闭系统中的手柄3E64(PID 4)? (是/否)y 关闭句柄时出错: 句柄无效。

6)

列出网络文件句柄,这里我们看到打开的网络共享到文件。

C:> openfiles / query -v

信息:系统全局标志'维护对象列表'需要       启用以查看本地打开的文件。       见Openfiles /?了解更多信息。

通过本地共享点远程打开的文件:

按类型访问的主机名ID #Locks打开模式打开文件(路径\可执行文件) 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

成功:与已打开文件“C:\ Log \ MyLockedFile.txt”的连接已终止。

8)

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

C:>处理C:\ Log \ MyLockedFile.txt

处理第3.56节 版权所有(C)1997-2011 Mark Russinovich Sysinternals - www.sysinternals.com

系统pid:4类型:文件3E64:C:\ Log \ MyLockedFile.txt

9)

文件无法移动/重命名,因为它仍在使用中

C:>移动C:\ Log \ MyLockedFile.txt C:\ Log \ MyLockedFile.txt.newName 该进程无法访问该文件,因为该文件正由另一个进程使用。         移动了0个文件。

1 个答案:

答案 0 :(得分:3)

只是张贴作为答案,因为看到这个问题无可救药地回答(嘿,通过神圣的机会,完全一年?)

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

“handle -c”给出无效句柄错误的原因可能与本地和远程运行“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”。之后,可以删除相关文件夹。