DOBON.NET DOBON.NETプログラミング掲示板過去ログ

ファイル監査について

環境/言語:[vb.net]
分類:[.NET]

いつもお世話になります。
ファイル監査について質問があります。
ファイルの変更を確実に取得したいと思っています。
ファイル監査については、
FileSystemWatcherクラスが用意されていますが、
一度に大量に変更した場合などにバッファを越えて取得漏れが発生する可能性があります。
「InternalBufferSize プロパティを使用してバッファ サイズを大きくする」等の回避方法はありますが、対処しているとはいえません。

FileSystemWatcher、もしくはそれ以外の方法で、
ファイル監査を確実に行う方法はありますか?
> 一度に大量に変更した場合などにバッファを越えて取得漏れが発生する可能性があります。

  私も使って監視させていますが・・・
  例えばChangeイベントで何か関連する行ないたい処理していません?
  そうすると反応が遅くなって取りこぼしがおきます。

  変更があったと言う履歴を作って、別スレッドで後から好きな処理を
  行なわせると取りこぼしは無くなる(非常に少なくなる)はずです。

  また、監視を開始する際に、どのディレクトリ下の全ファイルの名前
  と更新日付の辞書を作って、Changeイベントの際、変更されたファイ
  ルのフルパスを保存するのではなく、そのファイルがあるディレクト
  リ情報を保存して、別スレッドで最初に作った辞書と比較して変更を
  検知するとか・・・

  要は、Changeイベントの処理時間をいかに短くして取りこぼしなく、
  迅速に終われるか・・・が肝要かと。

  お試し下さい。

以上。
■No23119に返信(オショウさんの記事)
>>一度に大量に変更した場合などにバッファを越えて取得漏れが発生する可能性があります。
>
>   私も使って監視させていますが・・・
>   例えばChangeイベントで何か関連する行ないたい処理していません?
>   そうすると反応が遅くなって取りこぼしがおきます。
>
>   変更があったと言う履歴を作って、別スレッドで後から好きな処理を
>   行なわせると取りこぼしは無くなる(非常に少なくなる)はずです。
>
>   また、監視を開始する際に、どのディレクトリ下の全ファイルの名前
>   と更新日付の辞書を作って、Changeイベントの際、変更されたファイ
>   ルのフルパスを保存するのではなく、そのファイルがあるディレクト
>   リ情報を保存して、別スレッドで最初に作った辞書と比較して変更を
>   検知するとか・・・
>
>   要は、Changeイベントの処理時間をいかに短くして取りこぼしなく、
>   迅速に終われるか・・・が肝要かと。
>
>   お試し下さい。
>
> 以上。

オショウ様ご回答ありがとうございます。
一休とオショウ様・・・ふと一休さんのテーマソングが頭に流れて・・なんてことはおいといて

いまは、ファイル監査の調査をしており、処理等は行っていない状況です。

1.FileSystemWatcherを複数作成し(例えば4つ)、
ウォッチする種類NotifyFilterをそれぞれ、LastWrite、FileNameDirectoryName、Securityに設定し、Changed、Created、Deleted等のイベントが発生したら別スレッドで処理を実行する。
2.サブフォルダは監視せず、フォルダごとにFileSystemWatcherを作成。

といった構成を考えたりしていますが、
取りこぼしの確立を下げるだけで、取りこぼしが発生しないとは言い切れない気がします。

なので、今は、取りこぼすことを前提とし、取りこぼした場合に
どう処理すべきか考えておりますが、取りこぼしたファイルの情報も取れる方法もわからず、よい対処法が思い浮かびません。

引き続き、FileSystemWatcher、もしくはそれ以外の方法で、
ファイル監査を確実に行う方法があれば、ご教授願います。
> なので、今は、取りこぼすことを前提とし、取りこぼした場合に
> どう処理すべきか考えておりますが、取りこぼしたファイルの情報も取れる方法もわからず、よい対処法が思い浮かびません。

  取りこぼす可能性を考慮して確度を上げるアルゴリズムを考案するのは
  よいことだと思いますが・・・

  残るは、タイマーで一定周期で各フォルダのファイル名と更新日付の一
  覧を作り、前回の更新日付と比較するしか無いのでは?

以上。
■No23125に返信(一休さんの記事)
> 引き続き、FileSystemWatcher、もしくはそれ以外の方法で、
それ以外の方法としては,
一定時間ごとに全ファイル構成ツリーを作成し
 ・特殊なファイルやファイルリンクなどがあるため面倒,
 ・また一定時間内で終わらなければならないような制約が有る場合には難しい
一定時間ごとに前回の全ファイル構成ツリーと比較
 ・上記同様にリアルタイムな処理なら難しくなる
というのを望んでいると思うのですが,正直難関がありすぎです.

> ファイル監査を確実に行う方法があれば、ご教授願います。
むしろ取りこぼしが有ることを前提に,取りこぼしが有った場合に適切に対処する様に方針を変えるのはどうでしょう.
(ファイルを監査するのが最終目的でないのなら,という場合ですが)
オショウ様、も様、ご回答ありがとうございます。

>取りこぼす可能性を考慮して確度を上げるアルゴリズムを考案するのは
>よいことだと思いますが・・・

確度とリソースのバランスをうまく考えたほうがよいってことでしょうか

>残るは、タイマーで一定周期で各フォルダのファイル名と更新日付の一
>覧を作り、前回の更新日付と比較するしか無いのでは?

>それ以外の方法としては,
>一定時間ごとに全ファイル構成ツリーを作成し
> ・特殊なファイルやファイルリンクなどがあるため面倒,
> ・また一定時間内で終わらなければならないような制約が有る場合には難しい
>一定時間ごとに前回の全ファイル構成ツリーと比較
> ・上記同様にリアルタイムな処理なら難しくなる
>というのを望んでいると思うのですが,正直難関がありすぎです.
>
> ファイル監査を確実に行う方法があれば、ご教授願います。
>むしろ取りこぼしが有ることを前提に,取りこぼしが有った場合に適切に
>対処する様に方針を変えるのはどうでしょう.
>(ファイルを監査するのが最終目的でないのなら,という場合ですが)

ファイル情報をDBで保持し、リアルタイムでファイル操作を監査、DBに登録といったことをしたかったのですが確実に行う方法はなさそうですねぇ

監査ポリシーのイベントログを使用する場合もポーリングしないとできないようですし・・・


FileSystemWatcherでバッファを越えて取得漏れが発生した場合は、エラーが返ってくるようなので、
FileSystemWatcherでリアルタイムで監視しつつ、
エラー(取得漏れ)が発生した場合は、
一定時間ごと(夜間バッチ等)に、監視しているフォルダの全ファイル情報を取得・比較することで確実にファイル監査を行う で解決にしようと思います。

ありがとうございました!
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板