7

首先,很抱歉这个问题很长,但我想提供足够的细节。

概要:

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

问题:

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

背景:

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

重新创建问题:

0)

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

1)

创建一个新目录并共享它

2)

在新目录中创建一个文件

3)

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

4)

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

C:>句柄 C:\Log\MyLockedFile.txt

Handle v3.46 版权所有 (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:>句柄-c 3E64 -p 4

Handle v3.46 版权所有 (C) 1997-2011 Mark Russinovich Sysinternals - www.sysinternals.com

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

6)

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

C:>打开文件/查询-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

Handle v3.46 版权所有 (C) 1997-2011 Mark Russinovich Sysinternals - www.sysinternals.com

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

9)

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

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

4

1 回答 1

4

只是作为答案发布,因为看到这个问题悬而未决(嘿,碰巧,正好一年?)

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

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

出于我自己的目的,在我自己的场景中,我最终强制关闭了一个句柄(只是因为我想以一种快速而肮脏的方式关闭它——使用你提到的 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

但是,当再次远程运行句柄命令并没有给出任何结果(没有打开的句柄)时,我试图删除的文件夹仍然被锁定。一段时间后(我还尝试使用“net use f: /delete”断开有问题的网络共享,但无济于事,因为它“正在被活动进程访问”) - 我发现我自己的本地机器是仍然保留该目录的打开句柄 - 实际上我强制关闭的句柄来自我自己的机器。我使用 Process Explorer GUI 关闭它们没有问题,这应该等于在命令提示符下使用“句柄”。之后,可以删除有问题的文件夹。

于 2013-05-28T13:43:57.857 回答