制限ユーザ権限でのUSBメモリのFlush方法

[戻る]
ブヒブヒ 2010/03/15(月) 15:57:15
制限ユーザ権限での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()でボリュームの
ハンドルを取得でき、フラッシュする関数も成功します。

ご迷惑をおかけしますがよろしくお願いいたします。

aetos 2010/03/15(月) 17:41:06
どうにもなりません。どうにかなったらセキュリティホールです。

> 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

ブヒブヒ 2010/03/15(月) 18:40:07
aetos様
お返事ありがとうございます。

お返事の内容はFlushFileBuffers()は管理者権限が必要とのことですが、
CreateFile()でボリュームを開くためにも管理者権限が
必要となるのでしょうか?

もし、そうならば、制限ユーザ権限で
USBメモリのフラッシュを行う方法は無いのでしょうか?

よろしくお願いいたします。
ブヒブヒ

aetos 2010/03/15(月) 23:51:35
> CreateFile()でボリュームを開くためにも管理者権限が
> 必要となるのでしょうか?

YES。

> The following requirements must be met for such a call to succeed:
> &#8226;The caller must have administrative privileges.
>  For more information, see Running with Special Privileges.
> &#8226;The dwCreationDisposition parameter must have the OPEN_EXISTING flag.
> &#8226;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

aetos 2010/03/15(月) 23:53:52
> もし、そうならば、制限ユーザ権限で
> USBメモリのフラッシュを行う方法は無いのでしょうか?

ないでしょう。
「フラッシュだけなら害はないじゃないか」と思われるかもしれませんが、ボリューム
を書き込みアクセスで開けるっていうことはフォーマットだってデータの破壊だってで
きるということです。

tetrapod 2010/03/15(月) 23:58:26
っていうか Flush したいんぢゃなくて、安全に取り外ししたいだけなんぢゃ?

PATIO 2010/03/16(火) 10:00:59
安全に取り出す為のダイアログを出してあげると言うのは
無しなんですかねぇ。

ブヒブヒ 2010/03/16(火) 12:00:43
皆様
お返事ありがとうございます。

目的はUSBメモリ内のファイルを削除し、
削除処理をすぐにUSBメモリに反映させたいのです。

というのも、
ツールが書き込み動作を終えた直後に
取り外し処理をせずにUSBメモリを抜くユーザが
結構居るのです。
そのため、遅延書き込みでファイルが削除されていなかった
ということが発生しています。
#ツールには取り外しボタンをつけてあります。
#データの書き込みにはCFile::Flush()を使用しています。

なにか良い方法がないでしょうか?
よろしくお願いいたします。

aetos 2010/03/16(火) 12:59:34
削除ポリシーを「クイック削除のために最適化する」にすればいい、とか?

仲澤@失業者 2010/03/16(火) 13:57:59
FILE_FLAG_WRITE_THROUGH を指定するとか?

仲澤@失業者 2010/03/16(火) 14:19:13
言い忘れましたけど、USBメモリ等のリムーバブル記憶装置は
XP以降、基本ポリシーが変更されて、NTFSでは無く
FAT又はFAT32でフォーマットされます。

CloseHandle()を行った(と思っている)にも関わらず当該ファイルに
障害が発生している場合。
 1.ソフトに何らかのバグがありCloseHandle()に失敗している。
 2.メディアがNTFSでフォーマットされている。(遅延書き込みされた)
 3.ユーザーが書き込み途中でメディアを抜いている。
の可能性があります。

ブヒブヒ 2010/03/16(火) 16:29:59
[[解決]]
皆様
お返事ありがとうございます。

制限ユーザ権限でUSBメモリのFlushが出来ないことが
わかりました。

別の方法(運用等)で解決できないか探してみます。

#遅延書き込みはWin2kがよく発生します。

ありがとうございました。
ブヒブヒ

古いスレッドには追加発言できません。