日々の備忘録

技術について日々学んだことを書きます。

Windows Sandbox と chocolatey でアプリケーション検証環境を作成する

Windows Sandbox と chocolatey でアプリケーション検証環境を作成する方法を記載します。

Windows Sandbox

Windows 10 Pro では Windows Sandbox という機能が利用できます。

docs.microsoft.com

ざっくり説明すると、ホストマシンと隔離された軽量なデスクトップ環境を一時的に構築する機能です。

ホストマシンと隔離されるので、安全かわからないアプリケーションをインストールして試したりすることができるとのこと。

一時的なものなので、稼働中のSandboxウィンドウを閉じれば削除されます。

chocolatey

Windows における、いわゆるパッケージマネージャソフトウェアです。

chocolatey.org

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ファイルが利用できます。

docs.microsoft.com

下記のように設定することで、ホストマシンの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が設けられており、短期間で何度も実行することはできないのでご注意ください。(ライセンスを購入すれば無視できるかもしれません)