ファイル操作(コピーや、作成、書き換え)を監視する方法


ヤマ  2009-04-03 05:19:29  No: 69910

仕事で、以下の処理を考えなくてはいけません。

他のプロセスでファイル操作(コピーや、作成、書き換え)があった場合、そのファイルのパスを取得する(最終的には、ログに残すような事をやります。)

ファイル操作を監視する方法をご存知の方がいましたら、教えていただけないでしょうか?

環境はVisual Studio2008で  .Net Frameworkは使用できません。
Win32 APIで実現できないでしょうか?


オショウ  2009-04-03 06:06:37  No: 69911

検索したら、一発で出てくるんだけれど・・・
何故見つけられないのでしょうか。

http://athomejp.com/goldfish/api/filechangenotification.asp

※  こういう機能のことですよネ?

以上。参考まで。


ヤマ  2009-04-03 08:06:40  No: 69912

オショウさん。  レスありがとうございます。

FindFirstChangeNotification()に関するサイトは、
何件か見つけましたが、結局は操作されたファイルのパスまでは取得
できないと思っています。


オショウ  2009-04-03 08:24:32  No: 69913

私の読みミス(早とちり)・・・
申し訳ない。

う〜ん・・・
ファイルを操作したユーザーの取得はやったことあります
が、操作したプログラムとなると・・・

OSは何でしょうか?
当然WinNT系ですよね・・・

昔はAPI HOOKで取得する方法がありましたが、XP以降は
ほぼ無理です。

自分自身が起動したアプリならWindowsのデバッギング機能
を使って可能かもしれませんが・・・

調べてみて解ったらカキコします。

以上。


ヤマ  2009-04-03 08:35:41  No: 69914

わざわざ、ありがとうございますm(_ _)m
OSはXPです。
APIフックの経験はありませんが、この辺りを少し勉強してみます。
ただ、APIフックってXP以降は不可能なんですか?
これは知りませんでした・・


オショウ  2009-04-03 08:42:00  No: 69915

以前、別件で他のサイトでカキコした際の情報で・・・

Process Monitor
http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx

このツールを使うと、Filterをうまく設定すれば、アプリが
どこのファイルを読み書きしたかイベントとして拾えます。

そのパスから監視したドライブ・フォルダか・・・判断でき
ますが、どういう方法で動作しているかは・・・分かりません。

一度、お試し下さい。

※  ログ量があるメモリ要領上限になっていますので、英語の
    ヘルプですが、コマンドライン オプションを読んでみて
    から動作させて下さい。

以上。


aetos  2009-04-03 19:44:24  No: 69916

ReadDirectoryChangesW ならファイル名も取得できます。
ただし、FindFirstChangeNotification も ReadDirectoryChangesW も、精度はあまり良くない(あまりに大量のファイルを監視しようとすると取りこぼす)らしいので、クリティカルな用途にはあまり向きません。

> 操作したプログラムとなると…

そんなこと書いてないと思いますけど。

> ただ、APIフックってXP以降は不可能なんですか?

そんなことはありません。
Vista ではどうだかわかりませんが。

> Process Monitor

これはフィルタドライバという手法を使っています。
Win32 API より確実に捕捉できると思いますが、プログラミングの難易度も段違いに高くなります。


オショウ  2009-04-03 20:51:00  No: 69917

> Vista ではどうだかわかりませんが。

    どこかの掲示板で以前にカキコしましたが
    VISTAでは、APIHOOKできない仕掛けが導入されています。
    と言う内容の記事を見ました・・・

以上。


rin  2009-04-03 21:12:21  No: 69918

質問の確認したいのですが

>他のプロセスでファイル操作(コピーや、作成、書き換え)があった場合、そのファイルのパスを取得する(最終的には、ログに残すような事をやります。)

1:対象となるプロセスを指定し
2:そのプロセスが、「事前に想定できない場所かつ、どんな名前のファイルを操作するかわからない」
という条件のもと
3:「操作したタイミングで、その操作したファイルの場所と名前を知りたい」

ということでいいのでしょうか?


ヤマ  2009-04-05 16:11:59  No: 69919

しばらく家を空けていました、失礼しました。
いろいろとご返事ありがとうございます。

>>rin さん
1:対象となるプロセスを指定し は指定しません。
OS上で動いてるすべてのプロセスのファイル操作を監視する必要があります(主に社内のファイル操作後のセキュリティーチェックや、操作ファイルびログ収集を行う予定ですので)
2,3はその通りです。

>>aetosさん
フィルタドライバですか・・・
格段と難易度が高くなる気がしてきました。

しばらくはAPIフックと、少しフィルタドライバについて調べてみます。
やはり、けっこう難しいみたいですね(^^;


aetos  2009-04-05 21:21:11  No: 69920

ReadDirectoryChangesW では、あまりに多数のファイルを監視しようとすると、漏れるファイルが出てくる、というのはよく聞く話ですが、MSDN で確かな根拠を探せませんでした。

http://msdn.microsoft.com/en-us/library/aa365465.aspx
には、

> When you first call ReadDirectoryChangesW, the system allocates a buffer to store change information. This buffer is associated with the directory handle until it is closed and its size does not change during its lifetime. Directory changes that occur between calls to this function are added to the buffer and then returned with the next call. If the buffer overflows, the entire contents of the buffer are discarded and the lpBytesReturned parameter contains zero.

とありますが、これは、バッファサイズさえ十分ならばよく、変更間隔は失敗理由にならないように見えます。
とはいえ、あらかじめファイル数や変更頻度がある程度絞れなければ、バッファサイズをどの程度確保すればよいかわからないわけですが。

フィルタドライバは、アンチウィルスソフトなど、セキュリティのため確実に検出する必要がある用途に使われています。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加