DLLを利用しているプロセスを探すPowerShellスクリプト
Windows でファイルを削除しようとして、そのファイルが利用中であるために削除できないという経験をしたことはありますか?
その際、そのファイルがDLLだったりすると、いったいどのプロセスがそのDLLを使っているのかを見つけるのが困難だったのではないでしょうか?
PowerShell の機能を使うと、どのプロセスがDLLを利用中なのかを確認することが可能ですので、そのスクリプトの例をここで共有します。
DLL を使っているプロセスを探す PowerShell Script
いきなり結論になりますが、以下のスクリプトを使うと、実行中プロセスの中から、指定した DLL を使っているものを発見することができます。
たとえば、以下のようにして使います[1]。
powershell -File findDllUsers.ps1 gvimext.dll
スクリプトの引数として探したい DLL の名前を指定すると、それを利用しているプロセスの名前と、PIDが得られます。
基本的な考え方
PowerShell の Get-Process
は、Process
オブジェクトのリストを返します。
この Process
オブジェクトの Modules
プロパティには、プロセスに読み込まれたモジュール(DLLや、ファイル)の情報を(ProcessModule
) のリストとして保持しています。
ProcessModule
オブジェクトの FileName
プロパティを見れば、読み込まれたモジュールのファイル名がわかりますのでこれと探しているDLLの名前を比較すれば、特定のDLLを読み込んでいるプロセスのIDと名前がわかるという寸法です。
その後の処理
もし、DLL を削除したいのであれば、見つけたプロセスを停止してください。タスクマネージャーを使ってもよいですし、taskkill コマンドを利用してもよいでしょう。
動作確認した環境
PS C:> Get-Host
Name : ConsoleHost
Version : 5.1.19041.3803
このスクリプトを書いた理由
Chocolatey で vim を管理し始めたら、アップデート時に gvimext.dll
が利用中でプログラムのアップデートに失敗するという現象が発生し、対策としてこのスクリプトを書きました。
スクリプトの元ネタは以下のサイトです:
この記事のもとになったスクラップ:
-
管理者権限がなくても使えます。 ↩︎
Discussion