Windows Server
 Computer >> コンピューター >  >> システム >> Windows Server

Windows ServerのSMB共有で開いているファイルを確認・強制解除する方法【GUI・openfiles・PowerShell】

Windowsファイルサーバーの管理者は、複数のユーザーによって同時に開かれている共有ファイルを強制的に閉じなければならない場面にしばしば遭遇します。このような状況が発生するのは、主に次のようなケースです。

  • デスクトップアプリケーションが正常に動作せず、ファイルが閉じられなかった
  • ユーザーがログオフを正しく行わずに退席した
  • ユーザーがファイルを開いたまま帰宅・休暇に入り、閉じ忘れた

いずれの場合も、共有ネットワークフォルダ上のファイルは開いたまま(ロックされたまま)となり、他のユーザーは編集できません。ロックされたファイルを開こうとすると、使用しているアプリケーションに応じて、次のようなメッセージが表示されます。

ドキュメント filename は別のユーザーが編集のためロックしています。読み取り専用コピーを開くには…

本記事では、Windowsファイルサーバー上で開かれているファイルの一覧を取得する方法、共有フォルダ上のファイルをどのユーザーがロックしているかを特定する方法、そしてファイルセッションを閉じる(リセットする)ことでロックを解除する方法を詳しく解説します。

Windows Serverで共有フォルダの開いているファイルを表示する

Windowsファイルサーバーでユーザーが開いているファイルの一覧は、標準搭載されているグラフィカル管理ツール「コンピューターの管理」(compmgmt.msc)を使用して確認できます。

ファイルサーバー上でコンピューターの管理コンソールを開くか、自分のPCからリモートでサーバーに接続し、「システム ツール」→「共有フォルダー」→「開いているファイル」へ移動します。ウィンドウ右側に、現在のSMBサーバーで開かれているファイルの一覧が表示されます。この一覧には、ファイルのローカルパス、ファイルを開いているユーザーアカウント名、ロック数、およびファイルが開かれているモード(読み取り または 読み取り+書き込み)が含まれます。

openfiles.exeコマンドで開いているファイル一覧を取得する

同じ一覧は、標準のコマンドラインツール 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 コマンドレットは、十分注意して使用してください。

Get-SMBOpenFile:PowerShellで開いているファイルを検索・クローズする

Windows Server 2012/Windows 8以降のPowerShellには、SMBサーバー上の共有やファイルを管理するための新しいコマンドレットが追加されました。これらのコマンドレットを使用すると、開かれているファイルへのネットワーク接続をリモートで閉じることができます。

開いているファイルの一覧は Get-SMBOpenFile コマンドレットで取得でき、リモートファイルへの接続の切断(リセット)には 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 コマンドレットを使用します。ファイルIDを指定して閉じることもできます。

Close-SmbOpenFile -FileId 4123426323239

しかし通常は、ファイル名で指定して閉じる方が便利です。

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

Out-GridViewで簡易GUIを作成してファイルを閉じる

Out-GridView コマンドレットを使えば、開いているファイルを検索して閉じるための簡単なGUIフォームを作成できます。次のスクリプトは、開いているファイルの一覧を表示します。Out-GridViewテーブルの組み込みフィルターを使って、SMBセッションをリセットしたいファイルを検索し、対象ファイルを選択してOKをクリックすると、選択されたファイルが強制的に閉じられます。

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

PowerShellでリモートコンピューターの開いているファイルを閉じるには?

Get-SMBOpenFile および Close-SmbOpenFile コマンドレットは、リモートで開かれている(ロックされた)ファイルを検索して閉じるためにも使用できます。まず、CIMセッション経由でリモートのWindows SMBサーバーに接続する必要があります。

$sessn = New-CIMSession –Computername lon-fs01

リモートサーバーに接続してPowerShellコマンドを実行するには、PSRemoting系のコマンドレットである Enter-PSSessionInvoke-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

  1. SWFファイルを開いて再生する方法【Windows・Mac対応の手順を解説】

    SWF(読み方は「スウィフ」)は、Small Web Format(スモール・ウェブ・フォーマット)の略称で、Adobeが開発したファイル形式です。ベクターグラフィックス、マルチメディア、ActionScriptを扱うために設計されており、インタラクティブなテキストやグラフィックスの両方を含むことができます。これらのアニメーションファイルは、主にWebブラウザで遊ぶオンラインゲームなどに利用されてきました。SWFファイルは、Adobe製品のほか、SWFTools、Ming、MTASCなどのサードパーティ製ソフトウェアでも作成できます。ただし、従来のメディアプレーヤーではほとんどサポートされてお

  2. Windows 10でEMZファイルを開く方法|Office・Photoshop・無料アプリで簡単に表示する手順

    メールやメッセージアプリでファイルを受け取るとき、見慣れない拡張子が付いたファイルが添付されていることがあります。いざ開こうとしても、うまく開けないケースは少なくありません。特にEMZファイルは、画像ファイルの一種でありながら、対応していないPCでは認識されず、そのままでは開けないことがあります。 この記事では、Windows 10で.emzファイルを開く方法をわかりやすく解説します。さらに、EMZファイルを簡単に開いて編集できる便利なアプリもいくつかご紹介します。最後まで読めば、作業を止めることなくスムーズにEMZファイルを扱えるようになるでしょう。 EMZファイルとは?Windows 1