すべての user で扱う file の配置場所
Visual Studio Setup Project で %PROGRAMDATA% へ file を配置する方法 の続き
無事 "%PROGRAMDATA%" に resources を配置することは出来ましたが、すべての user で変更可能であるという要件はこれだけでは満たせません。
ということで、installer で対象 resources の DACL を変更する必要があるのですが、その一つの方法をば。
Windows Installer database には LockPermissions Table というものがあり、こちらに追加することで任意の resources の DACL を変更することができます。
ただ、Visual Studio 2008 の Setup Project には LockPermissions Table を編集する UI を持っていませんので、MSI の作成後 ORCA や scripts 等で Windows Installer database を編集する必要があります。今回は ORCA を利用した方法を説明します。
ORCA は Visual Studio 2008 とともに install されないため、手動で install する必要があります。私の環境では Microsoft SDK v6.0A の installed folder 配下の "bin" folder に "Orca.Msi" が存在しました。また、Windows Installer 最新 version 4.5 の SDK にも最新の "Orca.Msi" が含まれているので、そちらを利用してもいいでしょう。どちらにしろ、main の application install 後 "Orca.Msi" を手動で実行してやる必要があるので注意が必要です。
"Orca.Msi" の install が完了したら、ORCA を起動し Visual Studio Setup Project で作成した MSI file を開きます。
今回 sample として用意した MSI file は "%PROGRAMDATA%" を "COMMONAPPDATA" として定義した folder 配下に "Test" という sub folder を作成するというものです。これから、この "Test" folder の DACL を変更します。
上記画像は ORCA で spamle の MSI file の Directory Table を表示したものです。3 行目の directory "_009F8BF9D3EC4C278D0F060093FC80E8" が "Test" folder です。今回、問答無用で folder を作成するように設定しましたので、同様の entry が CreateFolder Table にも存在します。
それでは、LockPermissions Table を覗いてみましょう。
何もないですね。列が 5 つ存在します。それぞれの役割は下記。
Column |
Description |
LockObject |
対象 object の primary key を指定 |
Table |
対象 objcet が存在する table name を指定 File, Registry, CreateFolder から選択 |
Domain |
Domain name を指定 (省略可) |
User |
User name を指定 |
Permission |
許可する access mask (32 bit 符号付き整数) を 10 進表記で指定 |
さて、それでは実際に試してみましょう。
今回対象 folder に対し下記のような DACL を付与します。
Domain |
User |
Access Rights |
NT Authority |
System |
フル コントロール |
BUILTIN |
Administrators |
フル コントロール |
BUILTIN |
Users |
変更 |
この場合、LockPermissions Table には下記 3 行を追加します。
LockObject |
Table |
Domain |
User |
Permission |
_009F8BF9D3EC4C278D0F060093FC80E8 |
CreateFolder |
NT Authority |
System |
268435456 |
_009F8BF9D3EC4C278D0F060093FC80E8 |
CreateFolder |
BUILTIN |
Administrators |
268435456 |
_009F8BF9D3EC4C278D0F060093FC80E8 |
CreateFolder |
BUILTIN |
Users |
-536805376 |
[Permission] の値がわけわからない? それはごもっとも。
Access mask とは bit flag の集合で下記 3 種類に分類できます。
Generic Access Rights, Standard Access Rights, Specific Access Rights
Generic Access Rights と Standard Access Rights はすべての object で有効ですが、Specific Access Rights はその object 専用の権限が定義されています。今回の場合対象は folder ですので File Security and Access Rights で確認できます。
268435456 は "フルコントロール" = GENERIC_ALL (0x10000000) を 10 進表記したものになります。-536805376 はちょいとめんどくさいですが、下記の計算結果で ”変更" を示しています。
GENERIC_EXECUTE (0x20000000) | GENERIC_WRITE (0x40000000) | GENERIC_READ (0x80000000) | DELETE (0x00010000)
とりあえず対象は file のみですが、よく利用する access rights の対応表を作成してみました。
長くなりましたが、LockPermissions Table 編集後 MSI file を保存すれば DACL を変更する機能を付与した installer の完成です。
<参考>