「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 関数でファイル開いた場合に確認できるということしか確認してません。他の開き方 ( 実際にあるのかは知りません。。。 ) の場合にも確認できるのかという点は不明です。
ふぅ・・・以上です。