「使い捨て」ではないWindowsサンドボックスの活用方法
Windows 10 ProにはWindows Sandboxという素敵な仮想環境が標準装備されている。
Windowsサンドボックスは仮想マシンのイメージ保存ができない(仮想マシンを終了すると破棄されてしまう)、いわば使い捨ての仮想環境であり、一般的な使用用途してはせいぜいこんなところか。
- ブラウザで怪しいサイトを閲覧してみる
- 怪しいexeプログラムの挙動を確認してみる
- ホスト側環境を汚さずにソフトをインストールして試用する
ところが、「使い捨て」と割り切るにはまだ早い。
Windowsサンドボックスは仮想マシンの構成をXML形式の「.wsb」ファイルで記述することができるが、その中で「MappedFolder」によりホスト側とサンドボックス側でファイル共有する仕組みがある。これを利用すれば、仮想マシン上で更新されたファイルは仮想マシン終了後もホスト側のファイルとして存続する。ちょっとわかりにくい表現かもしれないが、ファイルだけに着目すれば、使い捨てではない永続的な仮想環境として活用可能となる、というわけだ。
サンドボックスの有効化
まずは機能を有効化しよう。手順は「Windows の機能の有効化または無効化」から「Windows サンドボックス」のチェックをオンするだけ。文系学部出身のパソコン苦手な新人SEでもできるくらい、至って簡単である。
具体的な活用用途
自社開発のとある.NETアプリケーションが、業務専用端末(Windows 10 IoT)のCドライブにアプリケーションのフォルダを配置して、ちょろっと環境変数を設定するだけで動作する。これを自社のOA環境(Windows 10 Pro)で実行しようとしたところ、セキュリティ的な制約でアプリケーションのexe起動がブロックされた。
このセキュリティの制約を掻い潜り、OA環境で自社開発.NETアプリケーションを動作させて、あわよくばリモートワークでテストなどができれば、と考えた際にWindowsサンドボックスを活用する方法に行き着いた。
アプリケーションのフォルダとサンドボックス用wsbファイルをZIP圧縮することで、他の開発メンバーにも配布しやすいのが嬉しい。
wsbファイルの共有フォルダ設定
wsbファイルに関するMicrosoft公式ドキュメントはこちら。
以下の具体例では、MappedFolderタグを使ってホスト側「D:\MyApp_Sandbox」フォルダをサンドボックス側「C:\MyApp」フォルダにマッピングして共有する。
<MappedFolders>
<MappedFolder>
<HostFolder>D:\MyApp_Sandbox</HostFolder>
<SandboxFolder>C:\MyApp</SandboxFolder>
<ReadOnly>false</ReadOnly>
</MappedFolder>
このwsbファイルからサンドボックスを起動すると、サンドボックス側で「C:\MyApp」からアプリケーションを起動し、「C:\MyApp」フォルダ内に保存された内容はすべてホスト側「D:\MyApp_Sandbox」にも同期するため、サンドボックスを終了しても次に起動した際は前回のファイルが続けて参照可能となる。
サンドボックス起動時に実行するPowerShell
Windowsサンドボックスは標準でOSのロケール設定が英語になっていたりするせいで、一部アプリケーションの動作に不具合が生じた。そこで、wsbファイルのLogonCommandを使用して、サンドボックス起動時のスタートアップで「boot.ps1」というPowerShellを実行し、ロケール設定を変更するようにした。
<LogonCommand>
<Command>powershell -executionpolicy unrestricted -command "start powershell {-file "C:\\MyApp\\boot.ps1"}"</Command>
</LogonCommand>
PowerShellスクリプトの内容はこんな感じ。
Write-Output ファイアウォールを無効化します...
Set-NetFirewallProfile -Enabled False
Write-Output 地域を「日本」に変更します...
Set-WinHomeLocation -GeoID 122
Write-Output 地域設定を「日本語」に変更します...
Set-Culture -CultureInfo ja-JP
(おまけ)時刻同期の無効化
Windowsサンドボックスはホスト側OSと自動で時刻同期するが、アプリケーションのテスト目的で日付や時刻を手動変更したい場合、「vmictimesync」というサービスを停止すればよい。
Discussion