
分離モードとサンドボックス
SB C&S後藤です。
前回のプロジェクトフォルダの解説はいかがでしたでしょうか? 振りではないですから、作業が終わっても消さないでくださいね。
さて、この回から仮想化されているアプリケーションの動作にかかわる設定、構成を解説していきます。仮想化という意味では、ここが考え方のキモになります。しっかりと押さえておきましょう。
インストール不要で動作して実際の環境に影響を及ぼさないことがThinAppによる仮想化のメリットです。複数バージョンのアプリを同時にインストールできるのもファイルやレジストリが分離されるためです。

仮想OSは、パッケージの中身・サンドボックス・実際の環境をうまく統合して扱います。
この仮想OSの働きにより、アプリの分離とユーザーの利便性が両立されています。
サンドボックスとは
サンドボックスは仮想アプリによる変更を保存する場所です。実態はフォルダーで、仮想アプリパッケージごとに作成されます。
パッケージ内のファイルやレジストリは読み込み専用です。ビルド後の変更はパッケージ内に保存されず、すべてサンドボックスに保存されます。
例えばアプリの設定をAからBに変更した場合、パッケージ内の設定ファイルはAのままで、サンドボックス内に新しい設定Bが書き込まれます。
サンドボックスの内容を削除すると、アプリの設定はまたAに戻ります。
パッケージに存在しないファイルであっても、Windowsのシステムに関わるファイルなどはサンドボックスに書き込まれて分離が確保されます。
サンドボックスの場所
サンドボックスはデフォルトではAppDataフォルダー以下に作成されます。
C:\Users\<USER>\AppData\Roaming\Thinstall\<SandboxName>
この他に仮想アプリと同じディレクトリにする設定と、特定の場所を指定する設定があります。
サンドボックスの場所を変更するにはプロジェクトフォルダーにあるPackage.iniを修正して再ビルドします。SandboxPathでパスを、SandboxNameでフォルダー名を指定します。
次の例は仮想アプリの実行可能ファイルと同じディレクトリにサンドボックスを作成する例です。
SandboxPath=.
SandboxName=TestApp
SandboxPathの指定が存在しない場合はAppDataがサンドボックスパスになります。
仮想アプリと同じ場所にThinstallというフォルダーを作成すると、設定を無視してそこがサンドボックスになります。
ポータブルメディアで仮想アプリを持ち運ぶ場合や、仮想アプリのテストの際に役立ちます。
分離モード(Isolation Mode)について
ThinAppで仮想化したアプリがどれだけ実環境のファイルやレジストリを参照・変更するかを指定するのが分離モードです。この項では主にファイルの分離モードについて解説していきます。
次の3つのモードがあります。
- Merged
- WriteCopy
- Full

FullはSetup Captureで指定できないモードです。設定ファイルを直接編集して指定する必要があります。
3つのモードいずれの場合も、Windowsのシステムに関するファイルとパッケージ内のファイルの変更はサンドボックスに保存されます。
Mergedモード
- ファイル参照 可能
- ファイル変更 実環境に反映
- 新規作成 実環境に作成
実環境のファイルを読んで、変更する場合も実際のファイルを変更して保存します。新規作成する場合も実環境にファイルを作成します。
パッケージ内のファイルを変更する場合などはサンドボックスに保存します。
一般的なアプリにはこの設定を適用します。
WriteCopyモード
- ファイル参照 可能
- ファイル変更 サンドボックスに保存
- 新規作成 サンドボックスに作成
実環境のファイルを読み込みますが、変更も新規作成もサンドボックスに行うモードです。
Fullモード
- ファイル参照 不可
- ファイル変更 不可(参照不可)
- 新規作成 サンドボックスに作成
実環境のファイルを一切読み込めないモードです。基本的に全体の設定では使用しないモードです。
設定方法
Setup Captureの設定でMergedとWriteCopyを選択できます。
プロジェクトフォルダーにあるPackage.iniファイルを開いて、以下の箇所を編集することでも設定できます。Fullモードの設定はこの方法でのみ適用されます。
以下のような記述がある場所が分離モードの設定です。
[Isolation]
DirectoryIsolationMode=Merged
変更後にbuild.batを実行すると、設定が適用されたパッケージが作成されます。
分離モードのディレクトリ個別設定
特定のフォルダーに対して個別に分離モードを設定することもできます。この設定は全体設定を上書きします。

プロジェクトフォルダーからキャプチャされたファイルのあるフォルダー(%AppData%など)を開きます。
##Attributes.iniがあればテキストエディターで開いてみましょう。
[Isolation]
DirectoryIsolationMode=Full
##Attributes.iniも編集・保存した後に再ビルドすれば設定が反映されたパッケージが作成されます。
レジストリ 分離モード
レジストリについても分離モードの指定があります。こちらは全体設定はなく、各レジストリキーに個別で指定しています。
試しにHKEY_LOCAL_MACHINE.txtを開いてみましょう。以下に一部を抜粋します。
isolation_full HKEY_LOCAL_MACHINE\Software\Classes\*\shell\ANotepad++64
Value=
REG_SZ~Notepad++ Context menu#2300
Value=ExplorerCommandHandler
REG_SZ~{B298D29A-A6ED-11DE-BA8C-A68E55D89593}#2300
Value=NeverDefault
REG_SZ=#00
冒頭にあるisolation_fullが分離モードの指定です。こちらは主にFullとWriteCopyが使用されています。
レジストリの分離モードを変更することはほぼありませんが、必要であれば該当のテキストファイルを編集して再ビルドしてください。
実際の動作例
実際にNotepad++で分離モードによる違いを試してみましょう。適当なテキストファイルを新規で保存してみます。

まず、ドキュメントフォルダー内の場所にファイルを保存します。通常のアプリと同じように、エクスプローラーでドキュメントフォルダーを表示すると保存したファイルが存在しています。

次にProgram Files以下に保存してみます。保存が完了してもエクスプローラーでProgram Filesを表示するとファイルが存在しません。
次にエクスプローラーで仮想アプリのサンドボックスに移動してみます。サンドボックス内の%ProgramFilesDir%以下にファイルが保存されていることが確認できます。

ここでファイル分離モードをWriteCopyに変えます。ドキュメントフォルダーなどを含むユーザーのフォルダーはデフォルトで##Attributes.iniでMergedが設定されています。
プロジェクトフォルダーの%Personal%フォルダーを開いてください。そこに保存されている##Attributes.iniを編集してDirectoryIsolationMode=WriteCopyに変更します。
build.batを実行してアプリを再ビルドします。

最初と同じようにドキュメントフォルダー内にファイルを保存します。エクスプローラーでドキュメントフォルダーを表示してもファイルは存在していません。
サンドボックスを確認するとファイルが保存されています。
サンドボックスの役割や分離モードの動作の違いはお分かりいただけたでしょうか。
実際にいろいろと試してみるのが一番分かりやすいかと思いますので、ぜひテキストエディターなどを仮想化して試してみてください。
執筆協力
Nagisaworks 伊藤さま
ThinApp技術指南
著者紹介
SB C&S株式会社
ICT事業本部 技術本部
ソリューション技術統括部 技術推進室
後藤 正幸
