Windows Sandbox と chocolatey でアプリケーション検証環境を作成する
Windows Sandbox と chocolatey でアプリケーション検証環境を作成する方法を記載します。
Windows Sandbox
Windows 10 Pro では Windows Sandbox という機能が利用できます。
ざっくり説明すると、ホストマシンと隔離された軽量なデスクトップ環境を一時的に構築する機能です。
ホストマシンと隔離されるので、安全かわからないアプリケーションをインストールして試したりすることができるとのこと。
一時的なものなので、稼働中のSandboxウィンドウを閉じれば削除されます。
chocolatey
Windows における、いわゆるパッケージマネージャソフトウェアです。
choco install <package>
といった具合にインストールをコマンドとして実行できます。
Community Repositoryだけでもかなりの数のパッケージが用意されているため、大変便利です。
自動化
先に chocolatey を用いたインストールスクリプトを用意しておきます。
# install chocolatey [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072 Invoke-Expression ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1')) choco install -y "googlechrome"
これでGoogle chromeをインストールするスクリプトができます。
次にWindows Sandbox側の準備をします。
まず、Windows Sandboxを利用可能なように一度だけ下記コマンドを実行する必要があります。
Start-Process powershell {Enable-WindowsOptionalFeature -FeatureName "Containers-DisposableClientVM" -All -Online} -Verb RunAs
Windows Sandbox の起動ファイルとして、wsbという拡張子のxmlファイルが利用できます。
下記のように設定することで、ホストマシンのC:\ShareOnHostがSandbox側にC:\Sharedとして共有され、foo.ps1を自動で実行します。
<Configuration> <MappedFolders> <MappedFolder> <HostFolder>C:\ShareOnHost</HostFolder> <SandboxFolder>C:\Shared</SandboxFolder> <ReadOnly>true</ReadOnly> </MappedFolder> </MappedFolders> <LogonCommand> <Command>powershell.exe -ExecutionPolicy RemoteSigned C:\Shared\foo.ps1</Command> </LogonCommand> </Configuration>
あとはこのwsbファイルをダブルクリックするなり、powershell Start-Process path\to\box.wsb とするだけでSandboxが構築できます。
注意点
実は、上記と同じようにLogonCommandにchocolateyを使ったインストールスクリプトを指定するだけではパッケージインストールが上手くいきません。
私自身これにかなりはまってしまったのですが、chocolateyのlogを確認することで糸口が見つかりました。
chocolateyのlogは、C:\ProgramData\chocolatey\logs にあります。
- ERROR: The handle is invalid. などと表記されており、LogonCommandがウィンドウなしで起動されていることをタスクマネージャで確認している
- Sandbox内で直接インストールスクリプトをpowershell host上で実行させると問題なく動作する
以上のことから、chocolateyの動作にはpowershell hostをコンソールウィンドウありで起動する必要があると疑いを持ちました。
そして下記リンクの通りにLogonCommandを変更すると問題なく動作するようになりました。
Windows Sandbox PowerShell logon command window not visible - Stack Overflow
<LogonCommand> powershell.exe -ExecutionPolicy Unrestricted -Command "start powershell {{ -NoExit -File C:\path\to\install.ps1 }}" </LogonCommand>
ということで、簡易的にアプリケーションの検証環境が構築できました。
ちなみに、chocolateyのcommunity repositoryにはRate Limitが設けられており、短期間で何度も実行することはできないのでご注意ください。(ライセンスを購入すれば無視できるかもしれません)