制限ユーザ権限でのUSBメモリのFlush方法
いつもお世話になっております。
ブヒブヒでございます。
開発環境
Windows XP Pro SP3
Visual C++ 2005 SP1 MFC
動作環境
XP 制限ユーザ権限
2k 制限ユーザ権限
制限ユーザ権限でUSBメモリ内のファイルを削除後にドライブのFlushを
行いたいと思い、下記のアドレス通りに行ったのですがCreateFile()が失敗し、
GetLastError()でERROR_ACCESS_DENIEDを返してきます。
< http://support.microsoft.com/kb/436654/ja>
CreateFileのパラメータ設定は下記の通りです。
(第1引数のxはドライブレターを指定しています。)
HANDLE hFile=CreateFile( _T(\\\\.\\x:),GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,OPEN_EXISTING,0,NULL);
次にFlushFileBuffers()という関数を発見し、CreateFile()関数で
ボリュームを開くときにはGENERIC_WRITEである必要があります。と、
なっていたので、下記のように変更したのですが同じエラーが返ってきました。
HANDLE hFile=CreateFile( _T(\\\\.\\x:),GENERIC_WRITE/*GENERIC_READ*/,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,OPEN_EXISTING,0,NULL);
なお、両方とも管理者権限ではCreateFile()でボリュームの
ハンドルを取得でき、フラッシュする関数も成功します。
ご迷惑をおかけしますがよろしくお願いいたします。
どうにもなりません。どうにかなったらセキュリティホールです。
> To flush all open files on a volume, call FlushFileBuffers with a handle to
> the volume. The caller must have administrative privileges.
http://msdn.microsoft.com/en-us/library/aa364439(VS.85).aspx
aetos様
お返事ありがとうございます。
お返事の内容はFlushFileBuffers()は管理者権限が必要とのことですが、
CreateFile()でボリュームを開くためにも管理者権限が
必要となるのでしょうか?
もし、そうならば、制限ユーザ権限で
USBメモリのフラッシュを行う方法は無いのでしょうか?
よろしくお願いいたします。
ブヒブヒ
> CreateFile()でボリュームを開くためにも管理者権限が
> 必要となるのでしょうか?
YES。
> The following requirements must be met for such a call to succeed:
> •The caller must have administrative privileges.
> For more information, see Running with Special Privileges.
> •The dwCreationDisposition parameter must have the OPEN_EXISTING flag.
> •When opening a volume or floppy disk,
> the dwShareMode parameter must have the FILE_SHARE_WRITE flag.
http://msdn.microsoft.com/en-us/library/aa363858(VS.85).aspx
> もし、そうならば、制限ユーザ権限で
> USBメモリのフラッシュを行う方法は無いのでしょうか?
ないでしょう。
「フラッシュだけなら害はないじゃないか」と思われるかもしれませんが、ボリューム
を書き込みアクセスで開けるっていうことはフォーマットだってデータの破壊だってで
きるということです。
っていうか Flush したいんぢゃなくて、安全に取り外ししたいだけなんぢゃ?
安全に取り出す為のダイアログを出してあげると言うのは
無しなんですかねぇ。
皆様
お返事ありがとうございます。
目的はUSBメモリ内のファイルを削除し、
削除処理をすぐにUSBメモリに反映させたいのです。
というのも、
ツールが書き込み動作を終えた直後に
取り外し処理をせずにUSBメモリを抜くユーザが
結構居るのです。
そのため、遅延書き込みでファイルが削除されていなかった
ということが発生しています。
#ツールには取り外しボタンをつけてあります。
#データの書き込みにはCFile::Flush()を使用しています。
なにか良い方法がないでしょうか?
よろしくお願いいたします。
削除ポリシーを「クイック削除のために最適化する」にすればいい、とか?
FILE_FLAG_WRITE_THROUGH を指定するとか?
言い忘れましたけど、USBメモリ等のリムーバブル記憶装置は
XP以降、基本ポリシーが変更されて、NTFSでは無く
FAT又はFAT32でフォーマットされます。
CloseHandle()を行った(と思っている)にも関わらず当該ファイルに
障害が発生している場合。
1.ソフトに何らかのバグがありCloseHandle()に失敗している。
2.メディアがNTFSでフォーマットされている。(遅延書き込みされた)
3.ユーザーが書き込み途中でメディアを抜いている。
の可能性があります。
皆様
お返事ありがとうございます。
制限ユーザ権限でUSBメモリのFlushが出来ないことが
わかりました。
別の方法(運用等)で解決できないか探してみます。
#遅延書き込みはWin2kがよく発生します。
ありがとうございました。
ブヒブヒ