制限ユーザ権限でのUSBメモリのFlush方法 – プログラミング – Home

制限ユーザ権限でのUSBメモリのFlu...
 
通知
すべてクリア

[解決済] 制限ユーザ権限でのUSBメモリのFlush方法


ブヒブヒ
 ブヒブヒ
(@ブヒブヒ)
ゲスト
結合: 15年前
投稿: 26
Topic starter  

制限ユーザ権限での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
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

どうにもなりません。どうにかなったらセキュリティホールです。

> 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


返信引用
ブヒブヒ
 ブヒブヒ
(@ブヒブヒ)
ゲスト
結合: 15年前
投稿: 26
Topic starter  

aetos様
お返事ありがとうございます。

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

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

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


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

> 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


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

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

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


返信引用
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

っていうか Flush したいんぢゃなくて、安全に取り外ししたいだけなんぢゃ?


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

安全に取り出す為のダイアログを出してあげると言うのは
無しなんですかねぇ。


返信引用
ブヒブヒ
 ブヒブヒ
(@ブヒブヒ)
ゲスト
結合: 15年前
投稿: 26
Topic starter  

皆様
お返事ありがとうございます。

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

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

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


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

削除ポリシーを「クイック削除のために最適化する」にすればいい、とか?


返信引用
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

FILE_FLAG_WRITE_THROUGH を指定するとか?


返信引用
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

言い忘れましたけど、USBメモリ等のリムーバブル記憶装置は
XP以降、基本ポリシーが変更されて、NTFSでは無く
FAT又はFAT32でフォーマットされます。

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


返信引用
ブヒブヒ
 ブヒブヒ
(@ブヒブヒ)
ゲスト
結合: 15年前
投稿: 26
Topic starter  

皆様
お返事ありがとうございます。

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

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

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました