C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[1]: ProgramDataフォルダに格納したファイルの権限


(過去ログ 110 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■65112 / inTopicNo.1)  ProgramDataフォルダに格納したファイルの権限
  
□投稿者/ クンマー (1回)-(2013/02/06(Wed) 15:09:20)

分類:[VB.NET/VB2005 以降] 

VB2008を使っています。

一つのPCの全ユーザーでデータを共有するため、ソフトを最初に起動したときに
ProgramDataフォルダに指定のフォルダを作り、ここに初期データを格納するようにしたのですが、
別ユーザーでソフトを実行すると、このファイルへのアクセスが拒否され、
ここに格納したデータを上書きすることが出来なくなりました。

おそらく、最初にこのソフトを起動した時に格納したデータファイルの書き込み等のアクセス権限が、
その時のユーザ以外の標準ユーザーには割り当てられていないためだと思いますが、
初期データファイル格納時にこのファイルに対して全員がフルアクセス可能にするにはどうすれば
いいのでしょうか?
対象OSはWindows XP, Vista, 7です(Windows 8も同様かもお聞かせ頂けるとありがたいです)。
引用返信 編集キー/
■65113 / inTopicNo.2)  Re[1]: ProgramDataフォルダに格納したファイルの権限
□投稿者/ とっちゃん (43回)-(2013/02/06(Wed) 16:06:26)
とっちゃん さんの Web サイト
No65112 (クンマー さん) に返信
> 一つのPCの全ユーザーでデータを共有するため、ソフトを最初に起動したときに
> ProgramDataフォルダに指定のフォルダを作り、ここに初期データを格納するようにしたのですが、
> 別ユーザーでソフトを実行すると、このファイルへのアクセスが拒否され、
> ここに格納したデータを上書きすることが出来なくなりました。
>
どうやって作成しましたか?


> おそらく、最初にこのソフトを起動した時に格納したデータファイルの書き込み等のアクセス権限が、
> その時のユーザ以外の標準ユーザーには割り当てられていないためだと思いますが、
このメッセージを見たほぼすべての人が確認する手段を持たないため「おそらく」では
適切な回答をもらうことはできないと思ってください。
実際の事象を確認できるのは質問者本人だけです。


> 初期データファイル格納時にこのファイルに対して全員がフルアクセス可能にするにはどうすれば
> いいのでしょうか?
> 対象OSはWindows XP, Vista, 7です(Windows 8も同様かもお聞かせ頂けるとありがたいです)。
適切な権限を設定した、DiretorySecurity オブジェクトを利用して
System.IO.Directory.CreateDirectory( string, System.Security.AccessControl.DirectorySecurity );
メソッドで作成すればよいと思います。

何が適切な権限になるかは、何一つ情報がないのでわからないので、自分なりに調べてください。

アクセス権の問題は、非常にデリケートで作成方法や手順によっては、うまく設定できないことがあります。

また、質問する際に、ユーザーアカウントの詳細やフォルダの詳細などを記載してしまうとどこからかアタックを受ける可能性もあります。
そういうことに注意して、適度にはぐらかして質問するようにしてください。

なお、OSによって、アクセス制御は異なる可能性があります。
また、デフォルトのアクセス権も異なります。ですので、OSごとにきちんと動作を確認してください。

Windows 8 が同様か?という点ではおそらく Windows 7 と同じだと思いますが、確認をとっていないのでわかりません。



引用返信 編集キー/
■65120 / inTopicNo.3)  Re[2]: ProgramDataフォルダに格納したファイルの権限
□投稿者/ howling (180回)-(2013/02/06(Wed) 18:24:58)
No65112 (クンマー さん) に返信
とっちゃんさんの内容に追加する形となりますが、
「おそらく」と言うに至る経緯を書いてもらえないでしょうか。

ユーザー権限の話自体もあるにはあると思うのですが、
逆にわざと指定してやらないと、そういうことは起こらないと思うのです。

何となく最初見た感じですと、
初回起動時のファイルセーブ時に、ファイルを閉じ忘れているのではないか?と思いました。
2人目以降が書きこもうとした際に読み取り専用になっている、ということですよね?
(これも、読み取り自体は行えるのかどうか調べたのかどうか教えてください)

この2人目以降、というのも、1人目がソフトを起動している最中に2人目が動かしているのか、
ソフトを終了後に動かしているのか知りたいです。

そのエラーが起きた時に、セーブしてあるファイルのプロパティ自体も見て頂きたいなぁと。

何しろ色々情報が不足しています。
その中で、「おそらく」と視野を狭めてしまうのは時期尚早かと。
引用返信 編集キー/
■65122 / inTopicNo.4)  Re[3]: ProgramDataフォルダに格納したファイルの権限
□投稿者/ クンマー (2回)-(2013/02/06(Wed) 20:19:03)
みなさん、言葉足らずで申し訳ありません。

最初にこのソフトを起動した時に格納したデータファイルは、この時ソフトを起動したユーザー
(およびAdministrator権限者)に対してのみフルアクセスとなっており、
他の標準ユーザーに対しては変更・書込の権限が与えられていません。

「おそらく...」という言葉は、

「作成されたファイルにアクセス権限が割り当てられていないため、おそらくアクセス拒否の例外が発生したと思うのですが」

というように、「アクセス拒否の例外が発生した」にかかる言葉として使っており、
アクセス権限がないという事実はファイルのプロパティですでに把握しています。
確かに、「おそらくアクセス権限がない」という意味にも取れそうですね。
分かりにくくてごめんなさい。
ただ、そのような曖昧な質問をするつもりはありませんでしたので、悪しからず。

このファイルは、別のところに用意したテンプレート用のファイルを単純にコピーしただけで、
他の標準ユーザーでもフルアクセスできる共有フォルダからのファイルのコピーでも、
ProgramData配下のフォルダにコピーするとこうなります。)

しかしながら、ProgramData以下の指定フォルダの作成時、DiretorySecurityを使えばいいということが分かりました。
ありがとうございました。
解決済み
引用返信 編集キー/
■65126 / inTopicNo.5)  Re[1]: ProgramDataフォルダに格納したファイルの権限
□投稿者/ Azulean (91回)-(2013/02/06(Wed) 22:29:18)
No65112 (クンマー さん) に返信
> 一つのPCの全ユーザーでデータを共有するため、ソフトを最初に起動したときに
> ProgramDataフォルダに指定のフォルダを作り、ここに初期データを格納するようにしたのですが、
(略)
> 対象OSはWindows XP, Vista, 7です(Windows 8も同様かもお聞かせ頂けるとありがたいです)。

念のため。
ProgramData は Vista 以降のフォルダーだったと思いますが、XP 向けには別途作り込んでいるという理解でよいのだろうか…。

ディレクトリ取得の関数を適切に使っていれば、別のフォルダーを取得できますが、アクセス権の設定内容は OS によって違うので確認しておくことをお勧めしますし。
(確か、当時は My Documents 以外に書けないとかあったような気がするので)
解決済み
引用返信 編集キー/
■65131 / inTopicNo.6)  Re[4]: ProgramDataフォルダに格納したファイルの権限
□投稿者/ とっちゃん (44回)-(2013/02/07(Thu) 10:49:29)
とっちゃん さんの Web サイト
No65122 (クンマー さん) に返信
> このファイルは、別のところに用意したテンプレート用のファイルを単純にコピーしただけで、
> 他の標準ユーザーでもフルアクセスできる共有フォルダからのファイルのコピーでも、
> ProgramData配下のフォルダにコピーするとこうなります。)
>
この部分を最初の質問の時に一緒に書いていれば、「おそらく」という言葉を使っていても
より具体性のある回答が得られたと思います。

掲示板の質問ではよく後出しでいろいろ事例を出してくることがありますが、多くの場合最初に書いておけば
最後の一文で済んだのに。。。なんてことが往々にしてあります。

質問者が出し惜しみすると、多くの場合余計な手間が二重三重にかかることになり
回答を得られるまでの時間が多大になる(場合によっては、回答にたどり着けないことすらある)ことがあります。



> しかしながら、ProgramData以下の指定フォルダの作成時、DiretorySecurityを使えばいいということが分かりました。
> ありがとうございました。

Azuleanさんも書いていますが、ProgramData フォルダという名称は、Vista から使われているもので
XPでは別の名称ですし、必ずしもC ドライブにあるとは限りません。

System.Environment.GetFolderPath( System.Environment.SpecialFolder.CommonApplicationData ) メソッドで
実行環境のパスを取得していれば問題ありませんが、OSごとではなく実行環境ごとに異なるので
絶対にハードコーディング(必ず C:\ProgramData だなどという解釈)はしてはいけません。

また、アクセス権はOSによって異なります。
XP/Vista/Windows7/Windows8 それぞれで異なりますし、古いOSからアップグレードした場合と
新規インストールの場合でも異なることがあります。
また、ファイルシステムによっても異なります。
#FAT32環境は少なくなりましたが、それでも0ではない

アクセス権をどのように設定すればいいか?については、質問内容が異なるのでとりあえずパスしておきますが。


あと、同一マシンの複数ユーザーで書き込みできるようにする場合
同時実行(ユーザー切り替えによる複数ユーザーでの同時利用)の考慮も必要です。

何を保存するのかわかりませんが、保存時に別ユーザーアカウントでアプリが動作していた場合
そのまま保存していいのか?ということも考慮が必要ですよ。

多くの場合、起動時に読み取って終了時に保存としているため、後勝ちになり
「データが消えた!どうなってる!!!責任者呼べ!」
となりがちです。

#一応解決済みはチェックしたままにしておきます。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -