如何查看和关闭Windows Server SMB共享中的打开文件?

时间:2020-01-09 10:46:42  来源:igfitidea点击:

Windows文件服务器管理员通常必须强制关闭由多个用户同时打开的共享文件。如果桌面软件无法正常工作,用户注销不正确或者用户打开文件而忘记关闭文件(回家,度假等),通常会发生这种情况。在所有这些情况下,共享网络文件夹上的文件仍处于打开状态(并已锁定),并且其他用户无法修改。其他用户在尝试打开锁定文件时会看到这样的消息(取决于使用的应用程序):

The document filename is locked for editing by another user. To open a read-only copy of his document, click…

在本文中,我们将很好地展示如何获取Windows文件服务器上打开的文件列表,找出哪个用户将文件锁定在共享文件夹上以及如何关闭(重置)文件会话以解锁打开的文件。

在Windows Server上查看共享网络文件夹上的打开文件

我们可以使用内置的"计算机管理"(

compmgmt.msc

)图形管理单元。

打开文件服务器上的计算机管理控制台(或者从计算机上运行的管理控制台远程连接到服务器),然后转到"系统工具"->"共享文件夹"->"打开文件"。 当前SMB服务器上打开文件的列表显示在窗口右侧。该列表包含文件的本地路径,打开文件的用户帐户的名称,锁的数量以及打开文件的方式(读或者写+读)。

我们可以使用内置功能获得相同的打开文件列表

openfiles.exe

控制台工具。例如,使用以下命令,我们可以获取会话ID,用户名和打开文件的完整本地路径:

openfiles /Query /fo csv |more

当用户远程访问服务器上共享网络文件夹中的文件夹或者文件时,将创建一个新的SMB会话。我们可以使用这些会话ID管理打开的文件。

我们可以在远程服务器上显示打开文件的列表。例如,我们需要列出lon-fs01主机上共享文件夹中的所有打开的文件:

openfiles /Query /s lon-fs01 /fo csv

openfiles

命令还允许我们查看本地打开的文件列表。要使用它,请使用以下命令启用"维护对象列表"选项:

openfiles /local on

,然后重新启动服务器。之后,

openfiles

命令将显示由本地进程打开的文件(建议仅将此模式用于调试目的,因为它可能会对服务器性能产生负面影响)。

如何找出谁在锁定共享文件夹中的文件?

要标识打开(锁定)远程服务器lon-fs01的共享网络文件夹上的filename.docx文件的用户,请运行以下命令:

openfiles /Query /s lon-fs01 /fo csv | find /i "filename.docx"

/i

键用于执行不区分大小写的文件搜索。

我们只能指定文件名的一部分。例如,我们需要找出谁打开了一个名称为sale_report的XLSX文件。使用以下管道:

openfiles /Query /s lon-fs01 /fo csv | find /i "sale_report"| find /i "xlsx"

当然,我们可以在计算机管理GUI中找到此文件,但使用起来不太方便(此控制台不提供搜索功能)。

如何强制关闭SMB共享上的打开文件?

要关闭打开的文件,请在"打开文件"部分的文件列表中找到它,然后在上下文菜单中选择"关闭打开文件"。

如果文件服务器上有数百个打开的文件,则在控制台中很难找到特定文件。使用Openfiles命令行工具更为方便。正如我们已经讲过的,它返回打开文件的会话ID。使用此会话ID,我们可以通过重置SMB连接来强制关闭文件。

首先,我们需要找到打开文件的会话ID:

openfiles /Query /s lon-fs01 /fo csv | find /i "farm"| find /i ".xlsx"

使用收到的SMB会话ID断开用户与文件的连接:

openfiles /Disconnect /s lon-fs01 /ID 617909089

我们可以强制重置所有会话并解锁特定用户打开的所有文件:

openfiles /disconnect /s lon-fs01/u corp\mjenny /id *

注意强制关闭客户端在SMB服务器上打开的文件可能会导致未保存的数据丢失。因此,请使用

openfiles /disconnect

命令或者

Close-SMBOpenFile

cmdlet(在下面讨论)非常小心。

Get-SMBOpenFile:使用PowerShell查找并关闭打开的文件处理程序

Windows Server 2012/Windows 8的PowerShell版本中出现了用于管理SMB服务器上的共享和文件的新cmdlet。这些cmdlet可用于远程关闭与打开文件的网络连接。

我们可以使用Get-SMBOpenFile cmdlet获取打开文件的列表。 Close-SmbOpenFile用于关闭/重置与远程文件的连接。

要在Windows SMB服务器上显示打开文件的列表,请运行以下命令:

Get-SMBOpenFile

该命令返回文件ID,会话ID和完整文件名(路径)。我们可以显示带有用户名和计算机名(IP地址)的打开文件的列表:

Get-SmbOpenFile|select ClientUserName,ClientComputerName,Path,SessionID

我们可以列出特定用户打开的所有文件:

Get-SMBOpenFile –ClientUserName "corp\mjenny"|select ClientComputerName,Path

或者从特定的计算机/服务器:

Get-SMBOpenFile –ClientComputerName 192.168.1.190| select ClientUserName,Path

我们可以按模式显示打开文件的列表。例如,列出从共享文件夹打开的所有exe文件:

Get-SmbOpenFile | Where-Object {$_.Path -Like "*.exe*"}

或者使用特定名称打开文件:

Get-SmbOpenFile | Where-Object {$_.Path -Like "*reports*"}

Close-SmbOpenFile cmdlet用于关闭打开的文件处理程序。我们可以按ID关闭文件:

Close-SmbOpenFile -FileId 4123426323239

但是通过名称关闭文件通常更方便:

Get-SmbOpenFile | where {$_.Path –like "*annual2017.xlsx"} | Close-SmbOpenFile -Force

随着

Out-GridView

cmdlet,我们可以制作一个简单的GUI表单来查找和关闭打开的文件。以下脚本将列出打开的文件。我们应该使用Out-GridView表中的内置过滤器来查找要为其重置SMB会话的打开文件。然后,我们需要选择所需的文件,然后单击"确定"。结果,所选文件将被强制关闭。

Get-SmbOpenFile|select ClientUserName,ClientComputerName,Path,SessionID| Out-GridView -PassThru –title “Select Open Files”|Close-SmbOpenFile -Confirm:$false -Verbose

如何使用PowerShell关闭远程计算机上的打开文件?

Get-SMBOpenFile

Close-SmbOpenFile

cmdlet可用于远程查找和关闭打开(锁定)的文件。首先,我们需要通过CIM会话连接到远程Windows SMB服务器:

$sessn = New-CIMSession –Computername lon-fs01

我们还可以使用PSRemoting cmdlet连接到远程服务器以运行PorwerShell命令:

Enter-PSSession

或者

Invoke-Command

以下命令将找到打开文件pubs.docx的SMB会话并关闭文件会话。

Get-SMBOpenFile -CIMSession $sessn | where {$_.Path –like "*pubs.docx"} | Close-SMBOpenFile -CIMSession $sessn

通过按确认关闭文件

Y

。如此一来,我们已解锁文件。现在其他用户可以打开它。

要删除强制关闭SMB服务器上文件的确认,请使用

-Force

选项。

使用PowerShell,我们可以关闭SMB会话并解锁特定用户打开的所有文件(用户回家并没有释放打开的文件)。例如,要重置用户mjenny的所有文件会话,请运行以下命令:

Get-SMBOpenFile -CIMSession $sessn | where {$_.ClientUserName –like "*mjenny*"}|Close-SMBOpenFile -CIMSession $sessn