きっかけ
ファイルサーバー(Windows の共有フォルダ)に動画ファイルが大量にたまっています。あるとき「この中で自分が一番よく見ているのはどれだろう?」と気になりました。
ところが、これを後から調べる方法が意外とありません。
- エクスプローラーの「アクセス日時」は最後の 1 回分しか残らない(しかも既定では更新されないことが多い)
- 再生ソフトの履歴は端末ごと・ソフトごとにバラバラで、別の PC から見た分は分からない
- Windows の監査ログを有効にすれば記録はされるが、イベントビューアーで眺めるのは現実的ではない
「ファイルを開いた記録を貯めて、ファイル別のランキングで見られればいい」と思い、作ったのが FileAccessMonitor です。
できること
- 共有フォルダ内のファイルへの 読取・書込・削除 を、誰が・いつ・どの端末から行ったか記録
- Web 画面で ファイル別 / フォルダ別 / ユーザー別のランキング、アクセス推移グラフを表示
- 期間・キーワード・種別で検索し、CSV 出力
- 大量削除・大量変更を検知して Teams / Slack / メールへ通知(ランサムウェア対策を想定)
- 日本語 / 英語 UI、インストーラー 1 つで導入、MIT ライセンス
動画の用途では「ファイル別」タブがそのまま「よく見ている動画ランキング」になります。
仕組み
自前でファイル操作をフックしているわけではなく、Windows 標準の オブジェクトアクセス監査 を利用しています。
- 監視したいフォルダに SACL(監査エントリ) を設定する(ツールが自動で設定)
- ファイルが開かれると、Windows が Security ログに イベント 4663(削除は 4659 も)を書き込む
- ツールが
EventLogWatcherでそれをリアルタイムに購読し、SQLite に保存 - ASP.NET Core の Web API で集計し、ブラウザ(Bootstrap + Chart.js)で表示
4663 にはアクセスの種類が AccessMask として入っているので、これで読取・書込・削除を判定しています。
| 種別 | AccessMask |
|---|---|
| 読取 |
0x1 (ReadData) / 0x80000000 (GENERIC_READ) |
| 書込 |
0x2 (WriteData) / 0x4 (AppendData) / 0x40000000 (GENERIC_WRITE) |
| 削除 |
0x10000 (DELETE)、およびイベント 4659 |
属性の参照(0x80 ReadAttributes)などは除外しています。エクスプローラーでフォルダを開いただけで大量に記録される、ということは起きにくくしています。
SMB 経由のアクセスでは、4663 だけだと接続元が分かりません。そこで、ログオン(4624)・共有アクセス(5140)イベントと SMB セッション一覧から、接続元の IP アドレスと端末名を補っています。
作っていてハマったところ
- サービス停止中のイベント取りこぼし: 再起動やアップデートの間に開かれたファイルが記録されない問題がありました。最後に処理したイベントの RecordID を DB に保存し、起動時にそこから読み直すようにしました。ログがクリアされた場合や、古いイベントがすでに上書きされていた場合も検出しています。
- 大量アクセス時の書き込み負荷: 1 件ずつ INSERT すると遅いので、Channel 経由で最大 500 件ずつまとめて保存しています。保存位置(RecordID)も同じトランザクションで更新するので、重複も欠落もしません。
- フォルダへのアクセスも 4663 が出る: SACL はフォルダにも効くため、記録したものがフォルダかどうかを判定して除外しています。
導入手順
1. インストール
Releases から FileAccessMonitor-Setup-<バージョン>.exe をダウンロードし、共有フォルダがあるサーバー(PC)上で実行します。Windows サービスとして登録され、Web 画面(既定はポート 8080)が起動します。
インストーラーはコード署名していないため、SmartScreen の警告が出ることがあります。「詳細情報」→「実行」で進めてください。リリースページの SHA256SUMS.txt でハッシュを確認できます。
2. ログイン
ブラウザで http://<サーバー>:8080 を開き、ユーザー名 admin でログインします。初期パスワードは初回起動時にランダム生成され、サーバーの C:\ProgramData\FileAccessMonitor\initial-admin-password.txt に保存されています。ログイン後、右上のユーザーメニューからパスワードを変更してください(変更するとこのファイルは自動で削除されます)。
3. 監視フォルダを追加
「設定」タブで動画フォルダのパスを追加すると、SACL が自動で設定されます。
フォルダごとに記録するアクセス種別を選べます。今回のように「どれを見たか」だけ知りたいなら、読取だけにしておくとデータが無駄に増えません。
4. Security ログを大きくする(推奨)
既定の Security ログは小さく、すぐ上書きされます。サービスが止まっている間の分を後から拾えるよう、サイズを増やしておくと安心です。
wevtutil sl Security /ms:1073741824 # 1GB
実際に使ってみて
動画の読み込み回数は正確でなかった
一番知りたかった「どの動画をよく見ているか」は、再生すると複数回の読み取りイベントとして記録され、正確な視聴回数とはなりませんでした。ただ、複数回のイベントとして記録されるため、視聴傾向は分かります。
Windows が意外なファイルにアクセスしている
眺めていると、自分では開いた覚えのないファイルにも Windows がアクセスしていることに気づきます。普段は見えない OS の裏側の動きが見えるのも、地味に面白いところです。
中小企業でも使えるのでは?
もともとは個人的な興味で作りましたが、使っているうちに「これは中小企業のファイルサーバーでも使えるのでは?」と思うようになりました。
「このファイルを消したのは誰か」「退職予定者が大量にファイルを読んでいないか」を知りたい場面は、どの会社にもあります。ただ、商用の監査製品は高価です。Wazuh などの OSS は、ログ基盤の構築から始める必要があります。サーバーにインストーラーを 1 つ入れるだけで、誰がいつどのファイルを読んだ・変更した・消したかが分かるツールは、意外と選択肢が少ないと感じています。
そこで、通知(大量削除・大量変更の検知)、CSV 出力、操作ログ、ユーザー権限(Admin / Viewer)など、業務で使うことを想定した機能も追加しました。
注意点
- 件数は厳密には「再生回数」ではなく「ファイルを開いた回数」です。 手元では比較的正確でしたが、再生ソフトや操作(シークなど)によってはファイルを複数回開くことがあります。また、サムネイルの作成やウイルス対策ソフトのスキャンで記録されることもあります。
- サービスは 監視対象のファイルがあるマシン上で 動かす必要があります(リモートのサーバーは監視できません)。
- 家庭で使う分には問題ありませんが、職場で使う場合は、監視対象になる人へ事前に周知してください。
おわりに
「どの動画をよく見ているか」という個人的な興味から作り始めたツールですが、家庭の NAS 代わりの PC から中小企業のファイルサーバーまで、同じ仕組みで使えます。
実際に業務で試してみた感想や、不具合・要望があれば、GitHub の Issues で教えてください。
