
SBC&S 後藤です。
前回までの説明で、ThinApp のパッケージ作成から、チューニング、トラブルシューティングといったコアになる機能の解説をさせていただきました。
運用を含め、より使いこなしていただくために必要となる機能をご紹介します。
ThinApp スクリプト
今回の記事はかなり応用的な使用方法です。概要の部分だけ読んで、スクリプト作成を検討する段階で改めて参考にしていただくのが良いと思います。
スクリプトの概要
ThinAppのスクリプトは仮想アプリの開始前または終了後に処理を追加するための機能です。
- 利用可能期間を設けたいアプリに対して、起動時に日時をチェックして期間外であればアプリを終了させる
- 起動時に外部にある構成ファイルをサンドボックス内にコピーする
などといった用途に利用することができます。
スクリプトを使用するには、プロジェクトフォルダにスクリプトファイルを追加してビルドするだけです。キャプチャしたアプリには変更を加えないため、簡単に処理を追加することができます。
スクリプトは VBScript で記述します。VBScript そのものについては Microsoft のドキュメントやその他の解説サイトを参照してください。
使用に際しての注意点
スクリプトを使用するにあたって、注意点が2つあります。
まず1つ目、スクリプトの機能は2025年12月現在Omnissaによる公式ドキュメントが存在しません。
ThinApp が Omnissa に移行する前にドキュメントから削除され、そのまま今に至っています。古い ThinApp 公式ドキュメントをお持ちであれば、そちらを確認してください。ThinApp4.xであれば掲載されていると思います。
(今後追記されたり、古いドキュメントがアーカイブとして追加される可能性もあります)
注意点の2つ目は、スクリプトが VBScript を利用している点です。
VBScriptは2023年10月に非推奨であることがMicrosoftから発表されました。2027年ごろにはデフォルトでは無効となり、使用するにはWindowsの設定を変更する必要があります。そして、将来的にはWindowsから削除される予定です。
参考:Windows IT Pro Blog VBScript deprecation: Timelines and next steps
Windows から完全に削除されるのはまだ先であるとは思いますが、その前に ThinApp から削除される可能性もあるかもしれません。他の方法も検討のうえでスクリプトの機能を使用してください。
基本の使用方法
スクリプトの記述方法は一旦おいて、スクリプトファイルについて先に解説します。
スクリプトを記述するファイルは.vbs拡張子のファイルです。

このファイルをプロジェクトフォルダのルート(Package.iniがある場所)に作成します。拡張子を除くファイル名に特に決まりはありません。
ファイルの編集はVisual Studio Code (VS Code)などの拡張子に応じて文字を色分けしてくれるエディタがおすすめです。メモ帳でも編集できますが、ミスが起こりやすいので気をつけてください。
ファイルのテキストエンコーディングはUTF-8で問題ありませんが、日本語を表示したい場合はShift JISを使用する必要があります。
Windows 11のメモ帳やVS CodeはデフォルトがUTF-8なので注意してください。
ThinAppのコールバック関数
ここからはスクリプトの記述について解説していきます。
ThinAppのスクリプトには専用のコールバック関数が用意されています。コールバック関数は特定の条件で実行される関数です。
ThinAppのコールバック関数は4つあります。
OnFirstSandboxOwner - アプリがサンドボックスを最初にロックするときにのみ呼び出されます。一つの仮想アプリパッケージの中に複数のEXEファイル(エントリーポイント)がある状態で、その複数のEXEファイルを同時実行した場合、このコールバック関数が呼び出されるのは一番最初のEXEファイルが実行されたときのみです。次にこの関数が呼び出されるのは、全てのプロセスが終了して再度実行されたときです。
OnFirstParentStart - EXEファイルの実行時に呼び出されます。サンドボックスが同一の他のEXEファイルが実行されていてもこのコールバック関数は実行されます。
OnFirstParentExit - EXEファイルのプロセスが終了する際に実行されます。子プロセスが残っていても実行されます。
OnLastProcessExit - サンドボックスをロックしている最後のプロセス終了時に実行されます。最後に終了するのが子プロセスである場合、このコールバック関数が実行されるのは子プロセスの終了時です。
スクリプトの例
いくつかサンプルを提示しながらスクリプトの解説をしていきます。
「API関数」がいくつか登場しますが、これはThinAppに操作を指示するものです。どういった関数があるかはこの記事の最後にまとめています。
外部スクリプトの実行
仮想環境外にあるネットワーク共有上のスクリプトファイル(test.bat)を仮想アプリ開始時に実行します。
cmd.exeが起動するので、無限ループにならないように必ずコールバック関数を使ってください。
Function OnFirstParentStart
Set Shell = CreateObject(\"Wscript.Shell\")
Shell.Run \"\\cyan\shares\test.bat\"
End Function
アプリの使用期限を設定
決まった日付がきたらアプリを起動できなくする例です。
ExitProcessは現在のプロセスを終了させるAPI関数です。0を返して正常終了しています。
If Date >= #2027/04/01# Then
MsgBox "このアプリは無効です"
ExitProcess 0
End If
レジストリのインポート
アプリ実行時に外部の.regファイルから仮想レジストリに値をインポートするスクリプトです。
ExecuteVirtualProcess関数は仮想環境内部でコマンドを実行するAPI関数です。
Function OnFirstParentStart
ExecuteVirtualProcess "regedit /s C:\temp\test-reg.reg"
End Function
ファイルコピー
実行時にファイルをサンドボックスにコピーする例です。ビルドしたアプリ一式と設定ファイルConfig.iniが同じフォルダにある状態を想定しています。
GetEnvironmentVariableは環境変数の値を取得しています。環境変数TS_ORIGINはThinAppによってプライマリデータコンテナのフルパスの値がセットされています。
ExpandPathはThinAppのマクロ形式のパスを展開するAPI関数です。%ProgramFilesDir(x64)%\MyApp\はパッケージ内に存在しているものとします。
ファイルのコピー自体はVBScriptのFileSystemObjectを使用しています。実行するとサンドボックス内にファイルがコピーされます。
Function OnFirstSandboxOwner()
Dim Origin, LastSlash, SourcePath, Src, Dest, fs
Origin = GetEnvironmentVariable("TS_ORIGIN")
LastSlash = InStrRev(Origin, "\")
SourcePath = Left(Origin, LastSlash)
Src = SourcePath + "Config.ini"
Dest = ExpandPath("%ProgramFilesDir(x64)%\MyApp\Config.ini")
Set fs = CreateObject("Scripting.FileSystemObject")
If fs.FileExists(Src) Then
fs.CopyFile Src, Dest, TRUE
End If
End Function
cmd.exeを起動してcopyコマンドを実行する方法もあります。コピーするファイルの場所が固定の簡単な例を示します。
WaitForProcessでコピーが完了するまで待機しています。
Function OnFirstParentStart()
Call WaitForProcess(ExecuteVirtualProcess("cmd.exe /c copy C:\src.txt C:\dst.txt"),0)
End Function
ThinAppのAPI関数
ここからはThinAppのAPI関数を紹介します。スクリプトを実際に作成する際の参照にしてください。
「ThinApp4.6 ユーザーガイド」を元に作成しています。現在のWindowsとThinAppで全てのAPI関数について動作を確認したわけではありませんのでご了承ください。
AddForcedVirtualLoadPath
AddForcedVirtualLoadPath(Path)
DLLがパッケージ内に配置されていない場合でも、指定されたパスから全てのDLLを仮想DLLとしてロードするようにThinAppに指示します。
外部DLLをアプリケーションでロードする必要がある場合に使用します。
Package.iniのForcedVirtualLoadPaths パラメータと同じ結果になります。
パラメータ
Path ... ロードするDLLのファイル名またはパス。ディレクトリを指定するとそのディレクトリ、またはその下位ディレクトリにあるすべてのDLLをロードします。
ExitProcess
ExitProcess ExitCode
現在のプロセスを終了し、指定されたExitCodeを設定します
パラメータ
ExitCode ... 終了コード。0の場合は正常終了を表します。
ExpandPath
ExpandPath(InputPath)
パスをマクロ形式からシステム形式に変換します。
パラメータ
InputPath ... マクロ形式のパス
戻り値
システム形式のパス
ExecuteExternalProcess
ExecuteExternalProcess(CommandLine)
仮想環境の外部でコマンドを実行します。この関数を使用すると物理システムに変更を加えることができます。
パラメータ
CommandLine ... 実行するアプリケーションまたはコマンド
戻り値
整数のプロセスID。プロセスIDはWaitForProcess関数で使用できます。
ExecuteVirtualProcess
ExecuteVirtualProcess(CommandLine)
仮想環境の内部でコマンドを実行します。この関数を使用して仮想環境に変更を加えることができます。
パラメータ
CommandLine ... 仮想環境内部で実行するアプリケーションおよびコマンド
戻り値
整数のプロセスID。プロセスIDはWaitForProcess関数で使用できます。
GetBuildOption
GetBuildOption(OptionName)
Package.iniの[BuildOptions]セクション内にある設定の値を取得します。
パラメータ
OptionName ... 設定の名前
戻り値
文字列で設定の値を返します。指定された設定が存在しない場合は空の文字列を返します。
GetFileVersionValue
GetFileVersionValue(Filename, Value)
DLL、OCX、実行ファイルなどのファイルからバージョン情報の値を返します。「バージョン情報」にはバージョンや製品名、著作権情報などが含まれています。
パラメータ
Filename ... バージョン情報を取得するファイルのフルパス
Value ... 指定されたファイルのバージョン情報セクションから取得する値の名前(FileVersionやProductVersionなど)
バージョン情報の内容についてはFileVersionInfo クラスなどを確認してください。
戻り値
文字列を返します。値を特定できない場合、空文字を返します。
GetCommandLine
GetCommandLine
実行中のプログラムに渡されたコマンドラインパラメータにアクセスします。
戻り値
現在実行中のプログラムに渡されたコマンドライン引数を表す文字列を返します。
GetCurrentProcessName
GetCurrentProcessName
現在のプロセスの完全な仮想パスを取得します。
戻り値
仮想環境内部の完全な実行パス名を表す文字列を返します。ほとんどの場合、Program Filesから始まるパスが返ります。
GetOSVersion
GetOSVersion()
Windowsのバージョンに関する情報を返します。
戻り値
MAJOR.MINOR.BUILDNUMBER.PLATFORMID OS_STRING 形式の文字列を返します。
PLATFORMID は9x系なら1、NT系なら2となります。OSSTRINGはService Packなどの情報です。
この関数は最近のWindowsでは意図した値を返しません。Windows 11上で実行すると、6.2.9200.2(Windows 8の最終ビルド)の値が返ってきます。
GetEnvironmentVariable(Name)
GetEnvironmentVariable(Name)
指定された環境変数の値を返します。
パラメータ
Name ... 値を取得する環境変数の名前。
戻り値
環境変数の値の文字列を返します。
GetEnvironmentVariable("TS_ORIGIN")とすることで、実行している仮想アプリのプライマリデータコンテナのフルパスを取得できます。
RemoveSandboxOnExit
RemoveSandboxOnExit(YesNo)
最後の子プロセス終了時にサンドボックスを削除するか否かを設定します。
無条件で常に終了時にサンドボックスを削除したい場合は、Package.iniのRemoveSandboxOnExitが使用できます。
パラメータ
YesNo ... 1 = 削除する、 0 = 削除しない
SetEnvironmentVariable
SetEnvironmentVariable(Name, Value)
環境変数の値を設定します。
パラメータ
Name ... 値を格納する環境変数の名前
Value ... 格納する値
SetFileSystemIsolation
SetFileSystemIsolation(Directory, IsolationMode)
ディレクトリの分離モードを設定できます。
パラメータ
Directory ... 分離モードを設定するディレクトリのフルパス
IsolationMode ... 設定する分離モード 1 = WriteCopy, 2 = Merged, 3 = Full
Package.iniのDirectoryIsolationMode パラメータと同等です。
SetRegistryIsolation
SetRegistryIsolation(RegistryKey, IsolationMode)
レジストリの分離モードを設定できます。
パラメータ
RegistryKey ... 分離モードを設定するレジストリ キー。HKEYLOCALMACHINE は HKLM で、HKEYCURRENTUSER は HKCUで、HKEYCLASSESROOT は HKCR に置き換えます。例:HKCU\Software\Thinapp\Test
IsolationMode ... 設定する分離モード 1 = WriteCopy, 2 = Merged, 3 = Full
Package.iniのRegistryIsolationMode パラメータと同等です。
WaitForProcess(ProcessID, TimeOutInMilliSeconds)
WaitForProcess(ProcessID, TimeOutInMilliSeconds)
ProcessIDの動作が終了するまで待機します。
パラメータ
ProcessID ... 終了するプロセスID。プロセスIDはExecuteExternalProcessまたは ExecuteVirtualProcessから取得できます。
TimeOutInMilliSeconds ... プロセス終了の最大待機時間。タイムアウトさせない場合は0を指定します。
戻り値
整数を返します。0 = タイムアウト失敗, 1 = プロセス終了, 2 = プロセスが存在しないかセキュリティが拒否
執筆協力
Nagisaworks 伊藤さま
ThinApp技術指南
