サードパーティツールを使用せずにファイルをロックしたプロセスを見つける

プロセスで使用されているファイルまたはフォルダーを削除しようとすると、ファイルをロックしているプログラムの名前を示す「使用中のファイル」ダイアログが表示されます。

ただし、「使用中のファイル」ダイアログに、削除しようとしているファイルがロックされているプロセスの名前が表示されない場合があります。 場合によっては、ダイアログに「ファイルが別のプロセスで開いているため、アクションを完了できません」と表示されます。

プロセスとロックされたファイルを調査する場合、Windows Sysinternals Process Explorerは、ほとんどのユーザーが最初に思い浮かぶオプションです。 ただし、現在開いているファイルのリストと対応するプロセス名を表示するための2つの組み込みソリューションがあります。

1.リソースモニター

リソースモニター(resmon.exe)は、多くの便利な機能を備えた組み込みツールです。 リソースモニターを使用すると、現在のネットワークとインターネットの使用状況を追跡したり、ロックされたファイルの関連ハンドルを表示したり、タスクマネージャーを使用するのと同じようにプロセスを管理したりできます。

ファイルがロックされているプロセス名を見つけるには、[CPU]タブをクリックし、[関連付けられたハンドル]テキストボックスにファイル名またはその一部を入力します。

以前にリソースモニターについて説明しました。 これらの記事をチェックしてください:

  • リソースモニターを使用してファイルをロックしているプロセスを見つける方法
  • どのプログラムがすべてのインターネット帯域幅を使用していますか? リソースモニターを使用してそれを見つける

2.プロセスエクスプローラー

Process Explorerは紹介する必要がありません。 プロセスエクスプローラーでは、検索機能を使用してファイル名を入力するだけで済みます。 これは、ファイルにアクセスしているプロセスを示しています。

下部のペインビューから、必要に応じてファイルハンドルを閉じることができます。

昇格されて実行されているプロセスを管理するには、管理者としてProcess Explorerを実行する必要があります。 プロセスエクスプローラーを昇格するには、[ファイル]メニュー→[ すべてのプロセスの詳細を表示 ]をクリックします。

以下のProcess Explorer関連の記事を確認してください。

  • Windowsで頑固で削除できないファイルまたはフォルダーを削除する方法
  • 現在どのプログラムがWebカメラを使用しているかを見つける
  • 不明なエラーメッセージの原因となったプログラムを見つける方法
  • コンテナー内のオブジェクトの列挙に失敗したとはどういう意味ですか?

3. Windows Sysinternalsから処理する

Handleは、Microsoft Sysinternalsのユーティリティで、システム内のプロセスの開いているハンドルに関する情報を表示します。 これを使用して、ファイルを開いているプログラムを確認したり、プログラムのすべてのハンドルのオブジェクトタイプと名前を確認したりできます。 Handleは、Process Explorerのコマンドラインバージョンに似ています。

注:ハンドルv4.21には小さなバグがあり、ドライブ文字が大文字の場合、常に「一致するハンドルが見つかりません」と報告されます。 Microsoftが次のアップデートで修正することを願っています。

管理者のコマンドプロンプトウィンドウから、コマンドライン構文を使用して、ファイルを開いているプロセスを見つけます。

 handle.exe -a -u filename_with_path 

ファイル名にスペースが含まれている場合は、ファイル名を二重引用符で囲みます。

例:

 handle.exe -a -u "c:\ users \ ramesh \ desktop \ Mandate-form.pdf" 

(パスなしでファイル名をメンションすることは、必ずしもすべての状況で機能するとは限りません。常にフルパスを含めることをお勧めします。)

出力には、プロセス名、プロセス識別子、ユーザー名、ロックされた(ターゲット)ファイル名、およびパスが表示されます。

Sysinternalsハンドル:コマンドライン引数

 使用法:ハンドル[[-a [-l]] [-u] | [-c [-y]] | [-s]] [-p |] [名前] [-nobanner] 
-aすべてのハンドル情報をダンプします。
-lページファイルを利用したセクションハンドルを表示するだけです。
-c指定されたハンドルを閉じます(16進数として解釈されます)。

PIDでプロセスを指定する必要があります。警告:ハンドルを閉じると、アプリケーションまたはシステムが不安定になる可能性があります。

-y閉じるハンドルの確認を求めません。
-s開いているハンドルの各タイプの印刷カウント。
-uハンドルを検索するときに所有ユーザー名を表示します。
-pプロセスに属するハンドルをダンプします(部分的な名前を受け入れます)。
名前(フラグメントが受け入れられる)を使用してオブジェクトのハンドルを検索します。
-nobanner起動バナーと著作権メッセージを表示しません。

引数がないと、すべてのファイル参照がダンプされます。

Sysinternalsハンドルを右クリックメニューに追加

ファイルの右クリックメニューにSysinternals Handleを追加して、ファイルをロックしているプログラムをすばやく見つけることができます。 コンテキストメニューに追加するには、次の手順に従います。

  1. Microsoft Sysinternalsサイトからハンドルをダウンロードします。
  2. ファイルhandle.exehandle64.exeをフォルダーにコピーします-例d:\tools
  3. 次のコード行をメモ帳にコピーし、ファイルをfind_handle.vbsとして永続的な場所に保存します。
     'ファイル名引数を指定してSysinternals Handle.exeユーティリティを実行します。 '©Ramesh Srinivasan-//winhelponline.com/blog'作成日:2008年3月29日 '更新日:2019年6月11日' Windows 10オプションを含むすべてのバージョンのWindowsの場合Explicit Dim objShell、WshShell、objFSO、sBaseKey、 sFilename Set objShell = CreateObject( "Shell.Application")Set WshShell = CreateObject( "WScript.Shell")Set objFSO = CreateObject( "Scripting.FileSystemObject")If WScript.Arguments.Count = 0 Then sBaseKey = "HKCU \ Software \クラス\ * \ shell \ "WshShell.RegWrite sBaseKey&" FindHandle \ "、" FindHandle \ "、" REG_SZ "WshShell.RegWrite sBaseKey&" FindHandle \ command \ "、" wscript.exe "&" "" "&_ WScript .ScriptFullName& "" ""& ""& "" ""& "%1"& "" ""、 "REG_SZ" Else If objFSO.FileExists(WScript.Arguments(0))= True Then sFilename = lcase(WScript .Arguments(0))objShell.ShellExecute "cmd.exe"、 "/kd:\tools\handle.exe -a -u"&_ "" ""&sFilename& "" ""、 ""、 "runas" 、1 End If End If 

    注:上記のスクリプトでは、Sysinternals Handle.exeパスはd:\tools\handle.exeとしてハードコードされています。 プログラムが別のパスにある場合は、それに応じてスクリプトのパスを変更します。 64ビットWindowsの場合、 handle.exeまたはhandle64.exeのいずれかを使用できます

  4. find_handle.vbsをダブルクリックして、コンテキストメニューエントリをレジストリに追加します。 これは一度だけ行う必要があります。 ただし、スクリプトを別のフォルダーに移動した場合は、もう一度スクリプトをダブルクリックして、レジストリのパスを更新する必要があります。
  5. ファイルを右クリックすると、[ ハンドル検索 ]オプションが表示されます。 それをクリックするとスクリプトが起動し、handle.exeをファイル名引数で実行して、ファイルがロックされているプロセスを見つけます。

Find Handleコンテキストメニューエントリを削除するには、レジストリエディタ( regedit.exe )を起動し、次のキーを削除します。

 HKEY_CURRENT_USER \ Software \ Classes \ * \ shell \ FindHandle 

4. OpenFiles.exe —組み込みのコンソールツール

使用するもう1つの組み込みツールは、Openfiles.exeです。これは、Windowsの新機能ではないコンソールツールです。 もともとは、Windows Resource Kit 2000/2003ツールの一部として2000年に導入されました。 このユーティリティは、Windows Vista以降(Windows 10を含む)にデフォルトで含まれていました。 Openfilesは、ローカルまたは共有フォルダーから現在開いているファイルのリストを、ハンドルIDとプロセス実行可能ファイルの名前とともに表示します。 このツールを使用すると、共有フォルダーからリモートで開いている1つ以上のファイルを切断することもできます。

「オブジェクトリストの維持」グローバルフラグを初めて有効にする

まず、ローカルファイルハンドルの追跡を有効にするには、adminコマンドプロンプトから次のコマンドを実行して、「オブジェクトリストの維持」フラグをオンにする必要があります。

$config[ads_text6] not found
 openfiles / local on 

次のメッセージが表示されます。

情報:システムグローバルフラグ「オブジェクトリストの維持」が現在有効になっています。

このコマンドを初めて実行する必要があります。 次に、Windowsを再起動して変更を有効にします。

開いているファイルと対応するプロセス名を表示する

Windowsを再起動した後、管理コマンドプロンプトウィンドウで次のように入力します。

 オープンファイル 

これは、ファイル/ハンドルID、プロセス名、ローカルで開かれたファイル、またはローカル共有ポイントを介してリモートで開かれたファイルのリストを表形式でリストします。

リストまたはCSV形式で出力を表示するには、/ queryパラメーターを使用します。

 openfiles / query / FO LIST openfiles / query / FO CSV 

出力をクリップボードにコピーするには、出力を以下のようにClip.exeにパイプします。 次に、出力をメモ帳または任意の他のエディターに貼り付けます。

 openfiles | clip 

 openfiles / query / FO LIST | clip openfiles / query / FO CSV | clip 

コマンドプロンプトの出力をクリップボード にコピーまたはファイルに保存する方法 の詳細については、「 コマンドプロンプトの出力テキストをクリップボードにコピーする方法またはファイルに保存する方法」を 参照してください

特定のファイルがプログラムで使用されているかどうかを確認するには(およびどのプログラムかを知るには)、次のコマンドラインを使用できます。

 オープンファイル| findstr / i 

例:

 オープンファイル| findstr / i eiffel 

上記のコマンドは、ファイル名に「エッフェル」という単語を含むすべての開いているファイルを一覧表示します。 この例では、Word 2016は現在、ファイル「The Eiffel Tower.docx」(ID 4576)をロックしています。

また、「使用中のファイル」ダイアログでも同じことがわかります。

リモートで開かれたファイルを共有フォルダから切断します。

共有フォルダーから開いているファイルを切断して、ファイルの削除、名前の変更、または内容の変更を行うには、 /disconnectパラメーターを使用して、そのファイルへの接続を切断します。 コマンドラインオプションは次のとおりです。

 OPENFILES / Disconnect [/ Sシステム[/ Uユーザー名[/ P [パスワード]]]] {[/ ID id] [/ Aアクセス者] [/ O openmode]} [/ OP openfile]説明:管理者がファイルを切断できるようにします共有フォルダを介してリモートで開かれたフォルダ。 パラメータリスト:/ Sシステム接続するリモートシステムを指定します。 / U [domain \] userコマンドを実行するユーザーコンテキストを指定します。 / P [パスワード]特定のユーザーコンテキストのパスワードを指定します。 / ID id開いているファイルをファイルIDで切断することを指定します。 「*」ワイルドカードを使用できます。 / A accessbyby「accessedby」の値によって、開いているすべてのファイルを切断することを指定します。 「*」ワイルドカードを使用できます。 / O openmode「openmode」の値で、開いているすべてのファイルを切断するように指定します。 有効な値は、読み取り、書き込み、または読み取り/書き込みです。 「*」ワイルドカードを使用できます。 / OP openfile特定の「オープンファイル」名によって作成されたすべてのオープンファイル接続を切断することを指定します。 「*」ワイルドカードを使用できます。 /? このヘルプメッセージを表示します。 例:OPENFILES / Disconnect /? OPENFILES / Disconnect / ID 1 OPENFILES / Disconnect / A username OPENFILES / Disconnect / O読み取り/書き込みOPENFILES / Disconnect / OP "c:\ My Documents \ somedoc.doc" / ID 234 OPENFILES / Disconnect / Sシステム/ Uユーザー名/ ID 5 OPENFILES / Disconnect / Sシステム/ Uユーザー名/ Pパスワード/ ID * 

Openfiles.exeは、開いているすべてのファイルをプロセス名と共に一覧表示する機能を完全に果たしますが、プロセスを強制的に強制終了することはできません。 ただし、この優れた(ただし見過ごされている)組み込みのコンソールツールは、ファイルを使用しているプロセス名をすばやく見つけたい場合や、ネットワークユーザーが共有フォルダーを介してアクセスしているファイルを切断したい場合に便利です。サードパーティのソリューション。

5. OpenedFilesView

NirsoftのOpenedFilesViewは、システムで開いているすべてのファイルのリストを表示します。 開かれたファイルごとに、追加情報が表示されます:ハンドル値、読み取り/書き込み/削除アクセス、ファイルの位置、ファイルを開いたプロセスなど…必要に応じて、開いている1つ以上のファイルを閉じるか、またはファイルを閉じるプロセスを閉じることもできます。これらのファイルを開きました。

選択したファイルのプロセスを閉じるか、選択したファイルハンドルを閉じることができます。 ハンドル番号は16進値で表されますが、openfiles.exeコンソールツールは通常の形式で表示します。 このツールでは、右クリックメニューを使用して、現在ファイルを使用しているプロセスをすばやく見つけるためのコンテキストメニューオプションを追加することもできます。 コンテキストメニューオプション/コマンドラインサポートは、OpenedFilesViewが提供する最も便利な機能の1つだと思います。

関連記事