UAC有効時ユーザー共通データの保存場所

[戻る]
TKH 2011/02/23(水) 08:23:09
WinVista、Win7においてUAC有効時、管理者モード実行時でないとき、特定フォルダは各
ユーザーの固有フォルダにリダイレクトされる仕様になります。
各ユーザが管理者モードで実行しない場合も、アプリから環境設定値のような共通デー
タを取得するために共通ファイルにアクセスしたいと考えていますが、このようなファ
イルはどこに保存しておけば良いのでしょうか?
アプリはセットアップ時にで基本的にはProgramFilesにインストールされますが、アプ
リが有るフォルダに環境設定用ファイルを保存してしまうと、ユーザ切替時に、各ユー
ザー共通のデータにならなくなってしまいます。
ご教授お願いします。

Toshi 2011/02/23(水) 10:11:36
回答というわけではないのですが、私もこの問題はとても気になります。

通常であれば、以下の関数が戻すフォルダが最も適しているように思うのですが、

SHGetSpecialFolderPath(hWnd, szBuf, CSIDL_COMMON_APPDATA, 0);

// これに会社名とソフト名を追加して、
// C:\ProgramData\MyComp\MyAppName
// このフォルダに「app.dat」などのファイルを保存したいところです

残念ながら「CSIDL_COMMON_APPDATA」が返すフォルダも仮想化の対象と
なっています。つまり、通常モードで起動したアプリでこのフォルダの
ファイルの書き換えなどを行うと、互換性ファイルが作成されてしまいます。

すべてのユーザーが自由に変更できるグローバルな設定項目を保存した
ファイルは、どこのフォルダに格納すれば良いのでしょうかね?

YuO [E-Mail] 2011/02/23(水) 13:40:30
管理者権限で書き込んだ情報を取得するだけであれば,普通にCommonAppDataなりHKLMから
読めばよいです。

アプリケーションで共通項目を設定したい場合ならば,
1. CommonAppDataなりHKLMなりに保存先のディレクトリやキーを作成する
2. 1.で作成したディレクトリ/キーのDACLを変更して,Usersが子要素を修正可能に設定
する
という手順をインストーラーで行えばよいです。

PATIO 2011/02/23(水) 14:45:54
Microsoftの見解では、管理者権限が必要な部分のみ別アプリとし、
そのアプリに管理者権限の要求するようにしなさいとなっていたと思います。

既に書かれているように参照に関しては大丈夫だと思うので
更新する部分のみを別アプリにして管理者権限を要求するようにし、
メインのアプリケーションから起動するようなイメージなると思います。
更新後、メインのアプリケーションは再度情報の取得をする必要が
出てくると思いますけれど。

tetrapod 2011/02/23(水) 16:09:45
えぇー、たかだか設定変更のために管理者権限を要求するの?なんかヤダ。

そもそも「全ユーザーで共通の設定」をたった一人のユーザが変えていいのか?
ってあたりの「案件の検討」から始める必要があると思う。
少なくとも UNIX ではそういう発想はありえないので。

・インストール時に、当該マシンで全ユーザーに共通な設定をするってのはアリ。
 (インストールパスとか・インストール時に決まり、実行時に変えない設定)
・実行時に何か設定変更するとしたら、それはすべてユーザー単位。
でダメな理由が知りたい。

hirocco 2011/02/23(水) 17:30:40
共通の設定...

あっ,USB変換を使用してのCOMポートとかの設定とかは?
機器は一つしかないのにUSBの抜き差しでポート名称が変わってしまいますので,
差し替えた人はポートの設定を直さないといけない
でも、全てのユーザに対しても影響があるから、そこは共通の設定で直さないと。。。

とかはどうでしょう?

bun 2011/02/23(水) 18:36:24
手元の2008Serverで試してみましたが、
C:\Users\Public\Documents\ フォルダとかは使えませんか?

aetos 2011/02/24(木) 14:13:52
> 手元の2008Serverで試してみましたが、

2008 Server の UAC の設定はどうなってますかね。
あとログインユーザーは Administrator ですか?

2008 Server で Administrator でログインすると、Vista / 7 とは違い、デフォルトで
いきなり昇格状態になるはずです。
その状態で Public に書き込みができても、それは Vista / 7 で管理者実行している状
態と同じです。

TKH 2011/02/25(金) 08:23:18
皆様有り難う御座います。
返事が遅くなり申し訳ありません。
PATIO様の指摘通り「管理者権限が必要な部分のみ別アプリ」というのが本筋であ
ると思います。
別アプリというのは、別EXEであり別プロセスを起動させないと管理者権限へ昇格させる
ことが出来ないと言うことだと思いますが、DLL等から環境を書込する時だけ昇格させる
ような仕組みは出来るのでしょうか。
具体的には、管理者権限でない状態でアプリが起動されている状態で、環境設定ファイ
ルを保存するときだけ昇格させるような仕組みを取れればと思います。
保存する部分をDLL化し実行したいと思うのですが。(別EXEにした場合、別EXEとのデー
タのやりとりが面倒になる)
ご教授お願いします。

PATIO 2011/02/25(金) 13:43:42
例えば、単純にユーザー共通の設定ファイルを書き換えたいという話なら
そのファイルでデータのやり取りをすれば良いのではと言う話なんですが、
そう単純ではないのかな。
設定変更と言うだけの話なら編集側と参照側は切り離されていて
ファイルで情報を共有していると言う状態でも良いと考えました。
(だから変更後に参照側で読み直すという話なんですが)

別EXEにすると言うのは基本的に本体と切り離して考えられる事が
前提でこの部分のつながりが強いと色々と無理が出てきます。
その時だけ権限を上昇させるという部分は良く分からないので
ご自分で調べてみるか、他の識者の方にお任せします。
もし何かのついでに調べる機会があれば、わかった事を書き込むかも
しれませんが、そこは期待しないで下さい。

TKH 2011/02/25(金) 20:35:19
[[解決]]
やはり「ファイルでデータのやり取り」ですか。
その線で別EXEの方向で検討します。
ありがとうございました。

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