セキュリティ面の強化を前提に、リムーバルドライブなどの外部装置へのファイル転送を監視したいと考えています。
プログラムは常駐型で、FPDドライブにアクセスがあった際、コピーや削除などの操作をログとして取得していきたいのですが、可能でしょうか?
システム操作なので、Delphiが機能的に一番サポート出来ているのでは?と思っています。
インターネットでも、該当するコーティング事例を探しましたが、見付けられませんでした。
概略ですが
1.WM_DEVICECHANGEでドライブの挿入検知
2.GetLogicalDrivesで使用可能なドライブを探す
3.FindFirstChangeNotificationでファイルの移動検知
でどうでしょうか?
全てサンプルはネットで入手可能かと思います。
スタテツさん、ありがとうございます。
常駐型の大まかな雛形は出来上がったので、機能的なロジックを始めたのですが、WM_DEVICECHANGEでドライブの挿入検出を実施したところ、CD-ROMの検出は可能ですが、FPDドライブの検出確認は出来ませんでした。(エクスプローラでアクセスしても反応がありませんでした。)
PFDドライブのデバイスから発生するメッセージは、取得が出来ないのでしょうか?
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.
すいません、FPDドライブのタイプミスでした。
CD-ROMデバイス、リムーバルデバイス(MO)は検出できたのですが、内蔵タイプのFPD(USB接続ではありません)はエクスプローラからのアクセスでは検出できませんでした。
環境はWindowsNT(WS) SP6a + Delphi6.0 up1(Personal版)です。
提供していただいたソースを実行してみましたが、結果は同じでした。
CD-ROMやMOなどは、媒体挿入時に読み込みされますが、FPDは挿入しただけでは読み込みされないため、そういった制御の違いから、WM_DEVICECHANGEでの検出はできないものなのかと手詰まりです。
お役に立てず申し訳ないです。
フロッピーディスクアクセスについて色々調べてみましたが、
解決策には至りませんでした。相当難しそうです。
回避としては
1.デバイスマネージャでFDのデバイスを使用不可にしてしまう
2.アプリケーション起動時にFDを挿入しておいてFindFirstChangeNotificationを実行してしまう。
両方穴はありますが…
スタテツさん、色々ありがとうございました。
私も調べてみましたが、こんなに難しいとは思いませんでした。市販の監視ソフトで、FPD監視が出来ない旨がありましたので、それなら作ってやれ!と活き込んだまでは良かったのですが…。
FPDドライブが全く使えないとゆう利便が悪いのもネックになってしまうので…良い運用がないか検討してみます。
やっと分かりました。
以下のソースをタイマーとかスレッドでまわしてあげれば可能です。
フロッピーディスクが入っているかチェック
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
すごいですね、ありがとうございます。
SetErrorModeでFPDアクセス時のコントロールが取得出来れば、検出やアクセスタイミングが図れそうですね。試してみます。ご連絡まで。
ツイート | ![]() |