➡️

DLLを利用しているプロセスを探すPowerShellスクリプト

2024/02/15に公開

Windows でファイルを削除しようとして、そのファイルが利用中であるために削除できないという経験をしたことはありますか?
その際、そのファイルがDLLだったりすると、いったいどのプロセスがそのDLLを使っているのかを見つけるのが困難だったのではないでしょうか?

PowerShell の機能を使うと、どのプロセスがDLLを利用中なのかを確認することが可能ですので、そのスクリプトの例をここで共有します。

DLL を使っているプロセスを探す PowerShell Script

いきなり結論になりますが、以下のスクリプトを使うと、実行中プロセスの中から、指定した DLL を使っているものを発見することができます。

https://github.com/aikige/homeBinWin/blob/master/findDllUsers.ps1

たとえば、以下のようにして使います[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 が利用中でプログラムのアップデートに失敗するという現象が発生し、対策としてこのスクリプトを書きました。

スクリプトの元ネタは以下のサイトです:
https://stackoverflow.com/questions/54310513/scripted-method-to-find-and-kill-process-using-a-specific-dll

この記事のもとになったスクラップ:
https://zenn.dev/aikige/scraps/c6f6194bd42d64

脚注
  1. 管理者権限がなくても使えます。 ↩︎

Discussion