我怎么能确定哪个SMB客户端/会话在服务器2008R2 Windows文件服务器上打开特定的文件?

我需要的是将客户端名称或IP地址与打开文件相关联的方式,以便我可以干净地closures文件以进行维护。 NET SESSION不显示打开文件的名称和NET FILE不显示打开文件的客户端。 我希望能够交叉引用这两个命令的数据,但这似乎不可能。 我所看到的其他东西都提供了与这些命令相同的数据,没有明显的方式来确定哪个客户端机器打开了文件。


澄清:我不想强制closures服务器上的文件,冒着文件损坏的风险,导致客户端程序崩溃。

只要打开2008R2服务器上的“共享和存储pipe理”,您就可以得到一个相当好的想法,在右窗格中您将看到“pipe理会话”和“pipe理打开的文件”。 你可以先尝试一下。

如果失败了,你可以试试Sysinternals的Process Explorer。 做一个句柄search文件名。 应该find具有该文件的开放句柄的进程。 该进程属于哪个用户帐户?

编辑:对不起OP,我带你绕道,因为我没有完全理解你的问题。

在这里输入图像说明

非常感谢Ryan Ries的耐心和坚持。


我所做的只是一个batch file,它使用psexec(Sysinternals)将handle.exe(也是Sysinternals)推送到每个具有活动SMB会话的客户机作为目标用户,并检查与指定文件名或部分文件名匹配的句柄。

这可能不是很漂亮,但function是优雅的,这似乎做的工作。 (也就是说,它给了我一个IP地址列表,对应于我应该在手机上的人员列表)。现在运行需要15〜20秒,如果我根据用户名进行过滤,则需要约30秒。

唯一的参数应该是要匹配的文件名或文件名片段,尽pipe它也可以用目标机器和文件名来调用以仅检查该机器。
由于NET SESSION用于获取会话列表,因此默认情况下必须以pipe理员权限运行。 PsExec的文档声称,PsExec不会返回它自己的状态,所以我怀疑如果PsExec无法连接,可能会出现误报。 匹配句柄的文件也可能不在共享中,或者是不同的文件,从而导致误报。

 @SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION @ECHO OFF IF "%2" NEQ "" GOTO :check IF "%1" EQU "" ECHO No argument provided & GOTO :EOF ECHO Waiting for all instances of psexec.exe to return... FOR /F %%i in ('NET SESSION ^| findstr /I username') DO ( IF /I "%%i" NEQ "!LASTLINE!" ( start /B cmd /c %0 %%i %1 ) set LASTLINE=%%i ) :WAIT TIMEOUT 1 > NUL TASKLIST | findstr /I psexec 2> NUL > NUL IF %ERRORLEVEL% EQU 0 GOTO WAIT ECHO Press any key to continue... pause > NUL 2> NUL EXIT /B :check PSEXEC.EXE -s %1 -c handle.exe /accepteula -a %2 2> NUL |findstr /I %2 > NUL 2> NUL IF %ERRORLEVEL% EQU 0 ECHO Handle found on machine: %1 EXIT