「Windows」ファイルを開いているプロセスを特定する方法いろいろ

Windows 環境でファイルを開いているプロセスを特定する方法について調査した結果をまとめておきます。いろいろと方法があるっぽいですが、後述の方法であれば、Handle ツール ( ダウンロード必要ですが ) 使うの一番お手軽感があるかなって感じです。

※ 以下で動作確認した結果を書いてある箇所もありますが、以下のエントリーのサンプルを使ってファイルを開いてます。

Windows C でファイル読み込み - プログラム日記
http://a4dosanddos.hatenablog.com/entry/2015/07/29/012942


1. 監査ポリシー


監査ポリシーの「オブジェクト アクセスの監査」で "いつファイルにアクセスがあったか"、"どのプロセスがファイルにアクセスしたか" とかの情報をセキュリティログに記録できるみたいです。

・監査ポリシー
https://technet.microsoft.com/ja-jp/library/cc730601.aspx

ローカル グループ ポリシー エディター使える環境であれば、以下の Web ページで説明されている方法で設定すればいいのですが、Home Premium とかだとだぶん使えないっぽい ( gpedit.msc が効かない・・・ )。

Windowsコラム - 【解説】重要なファイルに対するアクセスを監査するには?:ITpro
http://itpro.nikkeibp.co.jp/article/COLUMN/20061127/254976/

そういう環境では Auditpol コマンドで設定する方法がある。

・Auditpol
https://technet.microsoft.com/en-us/library/cc731451(v=ws.10).aspx

PowerShell から以下の感じで設定できる。

PS C:\Windows\system32> auditpol /set /subcategory:"ファイル システム" /success:enable /failure:enable
コマンドは正常に実行されました。
PS C:\Windows\system32> auditpol /get /subcategory:"ファイル システム"
システム監査ポリシー
カテゴリ/サブカテゴリ                               設定
オブジェクト アクセス
  ファイル システム                               成功および失敗

イベントビューアーでセキュリティログ見ると、以下のような感じでファイルにアクセスした情報が出力されている。

オブジェクトへのアクセスが試行されました。

サブジェクト:
	セキュリティ ID:		testuser-PC\testuser
	アカウント名:		testuser
	アカウント ドメイン:		testuser-PC
	ログオン ID:		0x10f50d

オブジェクト:
	オブジェクト サーバー:	Security
	オブジェクトの種類:	File
	オブジェクト名:	C:\Users\testuser\Desktop\winFileLock\hoge.txt
	ハンドル ID:	0x30

プロセス情報:
	プロセス ID:	0x27dc
	プロセス名:	C:\Users\testuser\Desktop\winFileLock\WinFileTest.exe

アクセス要求情報:
	アクセス:	ReadData (または ListDirectory)
				
	アクセス マスク:	0x1

※ 有効にした監査を無効にするには disable を指定する。

PS C:\Windows\system32> auditpol /set /subcategory:"ファイル システム" /success:disable /failure:disable
コマンドは正常に実行されました。
PS C:\Windows\system32> auditpol /get /subcategory:"ファイル システム"
システム監査ポリシー
カテゴリ/サブカテゴリ                               設定
オブジェクト アクセス
  ファイル システム                               監査なし


2. Handle


Sysinternals Suite の中の Handle ツールを使う方法です。

・Handle
https://technet.microsoft.com/ja-jp/sysinternals/bb896655.aspx

オプション等いろいろあるみたいですが、hoge.txt を開いているプロセスを調べたい場合は、引数にファイルパスを指定してやれば OK。

Handle.exe C:\Users\testuser\Desktop\winFileLock\hoge.txt

WinFileTest.exe    pid: 9440   type: File            30: C:\Users\testuser\Desktop\winFileLock\hoge.txt


3. Openfiles コマンド


標準で利用可能な Openfiles コマンドを使う方法です。

・Openfiles
https://technet.microsoft.com/en-us/library/cc732490.aspx

・@IT:Windows TIPS -- Tips:オープンしているファイルを調査する
http://www.atmarkit.co.jp/fwin2k/win2ktips/306openfiles/openfiles.html

以下のような感じで情報が取れる。

C:\Windows\system32>openfiles | findstr hoge.txt
48    WinFileTest.exe      C:\Users\testuser\Desktop\winFileLock\hoge.txt


標準コマンドであるという点は魅力ですが、事前に「openfiles /local on」の実行が必要で、しかも、システム再起動をしないと有効にならない、というのが非常に面倒であります・・・


4. リソースモニタ


リソースモニタでもファイル開いているプロセスの確認が可能みたいです。タスクマネージャの [ パフォーマンス ] タブ - [ リソースモニタ ] から起動できます。

僕の Windows 7 SP1 Home Premium の環境だと、リソースモニタの [ CPU ] タブ - [ 関連付けられたハンドル ] の箇所で確認できました。確認の際は、[ プロセス ] の箇所で表示されているプロセスのチェックボックスを ON にしておく必要があるっぽいです ( 特定のプロセスがどのファイル開いているのか、という点を確認したい場合は、そのプロセスだけをチェックする感じで )。


5. Process Explorer


Process Explorer でも確認できるみたいです。

・Process Explorer
https://technet.microsoft.com/ja-jp/sysinternals/bb896653.aspx

[ Find ] - [ Find Handle or DLL... ] から確認したいファイル名を入力して [ Search ] をクリックするとファイル開いているプロセスが表示されました。


6. Process Monitor


これはあまりにも取得される情報が多すぎてあんまりおすすめできないですが ( Path 等でのフィルタリングは必要ですね )、一応、Process Monitor でも確認できそうではありました。

・Process Monitor
https://technet.microsoft.com/ja-jp/sysinternals/bb896645.aspx

ただ、CreateFile 関数でファイル開いた場合に確認できるということしか確認してません。他の開き方 ( 実際にあるのかは知りません。。。 ) の場合にも確認できるのかという点は不明です。


ふぅ・・・以上です。