web-dev-qa-db-ja.com

C:\ ProgramData \に書き込むときの特権/所有者の問題

C:\ Program Files(x86)\ MyApp\myapp.cfgの設定ファイルの書き込み、管理者権限 で指摘されているように、notC:\Program Files (x86)\MyApp\myapp.cfgに設定ファイルを書くことをお勧めします。

これの代わりに、私のソフトウェアはデータを_%ALLUSERSPROFILE%_のサブディレクトリに保存するようになりました(例:Win7では_C:\ProgramData\MyApp\myapp.cfg_)

[Pythonこれを行うにはmyfile = open(filename, 'a')を使用します。]

このファイルに関する問題が発生しました:

  • _User A_を使用してソフトウェアをインストールして実行すると、ファイル_C:\ProgramData\MyApp\myapp.cfg_が書き込まれました。
  • 次に、ユーザーを_User B_に変更し、ソフトウェアを再度実行しました。エラーが表示されました:_User 2_には_C:\ProgramData\MyApp\myapp.cfg_(_Permission denied_)を書き込む権利がありません.

なぜ? _%ALLUSERSPROFILE%_は、すべてのユーザーが記述できる場所ではありませんか?この問題を解決するには?

35
Basj

いいえ、C:\ProgramData、別名FOLDERID_ProgramDataでは、セキュリティ設定が制限されています。標準ユーザーはそこにファイルを作成できます。ただし、これらのファイルはデフォルトで保護されているため、ファイルを作成したユーザーのみが後でファイルを変更できます。

推奨される解決策は、インストーラが共有ストレージ用にC:\ProgramDataのサブディレクトリを作成することです。そして、そのサブディレクトリには、インストールプログラムによって寛容なACLを与える必要があります。これが、すべての標準ユーザーに必要なアクセスを許可するものです。

共有書き込み可能データが本当に必要かどうかは疑問です。通常、共有構成は、インストール時に指定され、管理者によってめったに変更されないものになると予想されます。ほとんどの構成データは、ユーザーごとになりがちです。

34
David Heffernan

C:\ ProgramDataへの書き込みにも問題があったので、これに追加したいと思います。私の問題は、C:\ ProgramData内のディレクトリ/ファイルが管理者によって書き込まれたということです。私のアプリが通常のユーザーの下で実行されたとき、そこに書き込むことができなかったため、Windowsは代わりにC:\ Users\fooface\AppData\Local\VirtualStore\ProgramDataを自動的に使用しました。アプリケーションでプロセスモニターを使用して、書き込み先のパスを見つけました。これを見た後、C:\ ProgramDataからファイルを削除し、アプリを再度実行し、期待どおりに書き込みました。

これが誰かを助けることを願っています。

0
Daniel Caban