リムーバルドライブ(FPD、MO)を使用した際の操作ログは取得可能ですか?


とほほ  2004-06-30 03:10:30  No: 9685

セキュリティ面の強化を前提に、リムーバルドライブなどの外部装置へのファイル転送を監視したいと考えています。
プログラムは常駐型で、FPDドライブにアクセスがあった際、コピーや削除などの操作をログとして取得していきたいのですが、可能でしょうか?
システム操作なので、Delphiが機能的に一番サポート出来ているのでは?と思っています。
インターネットでも、該当するコーティング事例を探しましたが、見付けられませんでした。


スタテツ  2004-06-30 06:40:00  No: 9686

概略ですが
1.WM_DEVICECHANGEでドライブの挿入検知
2.GetLogicalDrivesで使用可能なドライブを探す
3.FindFirstChangeNotificationでファイルの移動検知
でどうでしょうか?
全てサンプルはネットで入手可能かと思います。


とほほ  2004-07-02 01:05:16  No: 9687

スタテツさん、ありがとうございます。
常駐型の大まかな雛形は出来上がったので、機能的なロジックを始めたのですが、WM_DEVICECHANGEでドライブの挿入検出を実施したところ、CD-ROMの検出は可能ですが、FPDドライブの検出確認は出来ませんでした。(エクスプローラでアクセスしても反応がありませんでした。)
PFDドライブのデバイスから発生するメッセージは、取得が出来ないのでしょうか?


スタテツ  2004-07-02 03:14:26  No: 9688

PFDドライブってUSB接続のメモリースティック等ですよね?
私の方では検出します…
環境はWindowsXP sp1 + Delphi7pro up1です。

ソース
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
  private
    { Private 宣言 }
  public
    { Public 宣言 }
    procedure WmDevChange(var Mess: TMessage); message WM_DEVICECHANGE;
  end;
var
  Form1: TForm1;

implementation
{$R *.dfm}
{ TForm1 }
procedure TForm1.WmDevChange(var Mess: TMessage);
begin
ListBox1.Items.Add(inttostr(Mess.WParam));
end;
end.


とほほ  2004-07-02 19:42:39  No: 9689

すいません、FPDドライブのタイプミスでした。
CD-ROMデバイス、リムーバルデバイス(MO)は検出できたのですが、内蔵タイプのFPD(USB接続ではありません)はエクスプローラからのアクセスでは検出できませんでした。
環境はWindowsNT(WS) SP6a + Delphi6.0 up1(Personal版)です。
提供していただいたソースを実行してみましたが、結果は同じでした。

CD-ROMやMOなどは、媒体挿入時に読み込みされますが、FPDは挿入しただけでは読み込みされないため、そういった制御の違いから、WM_DEVICECHANGEでの検出はできないものなのかと手詰まりです。


スタテツ  2004-07-02 21:17:36  No: 9690

お役に立てず申し訳ないです。
フロッピーディスクアクセスについて色々調べてみましたが、
解決策には至りませんでした。相当難しそうです。

回避としては
1.デバイスマネージャでFDのデバイスを使用不可にしてしまう
2.アプリケーション起動時にFDを挿入しておいてFindFirstChangeNotificationを実行してしまう。
両方穴はありますが…


とほほ  2004-07-02 22:08:27  No: 9691

スタテツさん、色々ありがとうございました。
私も調べてみましたが、こんなに難しいとは思いませんでした。市販の監視ソフトで、FPD監視が出来ない旨がありましたので、それなら作ってやれ!と活き込んだまでは良かったのですが…。
FPDドライブが全く使えないとゆう利便が悪いのもネックになってしまうので…良い運用がないか検討してみます。


スタテツ  2004-07-03 01:12:17  No: 9692

やっと分かりました。
以下のソースをタイマーとかスレッドでまわしてあげれば可能です。

フロッピーディスクが入っているかチェック
procedure TForm1.Button1Click(Sender: TObject);
var EMode: Word;
begin
 EMode := SetErrorMode(SEM_FAILCRITICALERRORS);
 try
   if DiskSize(Ord('A')-$40) <> -1 then
     ShowMessage('Disk in drive A: !')
   else
     ShowMessage('No disk in drive A: !');
 finally
   SetErrorMode(EMode);
 end;
end;

その他色々
http://delphi.about.com/library/weekly/aa070699.htm


とほほ  2004-07-03 03:07:11  No: 9693

すごいですね、ありがとうございます。
SetErrorModeでFPDアクセス時のコントロールが取得出来れば、検出やアクセスタイミングが図れそうですね。試してみます。ご連絡まで。


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

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






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