Windows Sandboxの利用方法

今回はWindows Sandboxと、その活用法について紹介していきます。「過去に使おうとしたが制約が多く断念した」という方にも、近年のバージョンで変わってきた事もありますから、お役に立てるかもしれません。

# 概要
Windows SandboxはWindows OS Proエディション以上であれば使える仮想化機能の一つです。以下は起動直後のスクショです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133609/7029581a-51b1-a4ec-3222-7b2e72fc5961.png)
……単なるWindowsの画面ですが、タイトルバーが見えますね。Sandboxを実行すると、クリーンインストールされたWindows[^1]がかなり早く立ち上がります。
サンドボックスなので、終了すると環境は破棄され、次回起動時はまた真っ新な環境として起動します。

活用例としては、一般的なサンドボックス同様、リスクのあるコマンドやアプリケーションの実行などもありますが、開発環境では汚れがちな環境変数やデバッグランタイムのインストールも無いため、作成したプログラムが自身以外の環境で正常に動作するか確認したり、1から環境構築するドキュメント作成時にシミュレーションやスクショ作成に使ったりもしています。

# インストールから起動まで
おもむろにスタートメニューから開いていきましょう。
`設定`→`システム`→`オプション機能`→
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133609/2cb642de-9ffe-1fda-ad83-66e2b7bba718.png)
`Windows のその他の機能`→
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133609/f09f1708-76b3-3ca3-59da-5f963caee97c.png)
`Windows サンドボックス`にチェックを入れて再起動します。[^2]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133609/19767062-0b43-8eb4-5732-836276781364.png)

### 再起動後
スタートメニューの中にアプリケーションの一つとしてインストールされています。クリックで起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133609/78938589-1203-4309-558f-99ba9ce49ea2.png)

# ホストとのファイル共有
タイトルバーの右上にある`・・・`を押すとメニューが表示され、`Share folder`を選択するとホストPC側でフォルダ選択が出ますので、そちらで選んだフォルダがサンドボックス環境のデスクトップに出現します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133609/e1e435b8-5f6e-5789-14b7-2f620af8a4ba.png)
こちらはサンドボックス側からも読み書きが出来るフォルダなので注意して下さい。

# .wsbファイルの使い方
.wsbファイルは起動パラメータを記述するXMLファイルです。テキストエディタで編集後、ダブルクリックでSandboxが起動します。

```xml:my_sandbox.wsd
<Configuration>
</Configuration>
```

## ホストにあるディレクトリのマウント
先にファイル共有の説明しましたが、Sandboxを立ち上げる度にメニューから選択するのは面倒です。そこで.wsbにファイルパスを設定することで、起動のたびに自動的にホストにあるディレクトリをマウントする事ができます。

```xml
<Configuration>
  <MappedFolders>
    <MappedFolder>
      <HostFolder>d:\sandbox</HostFolder>
      <SandboxFolder>c:\host_sandbox</SandboxFolder>
      <ReadOnly>true</ReadOnly>
    </MappedFolder>
    <MappedFolder>
      ...
    </MappedFolder>
  </MappedFolders>
</Configuration>
```
`Configuration`の子ノードに`MappedFolders`、さらにその子ノードに`MappedFolder`を記述して指定することができます。
* `HostFolder`にはホスト側からサンドボックスに見せたいディレクトリを記述します
* `SandboxFolder`にはサンドボックスのどのパスに`HostFolder`をマウントするかを記述します
* `ReadOnly`を`true`に設定することでサンドボックス側から編集出来なくします


## その他のパラメータ
大半の機能はデフォルト有効化されているため、アプリケーションのテストとして制限環境の再現や、よりセキュアなサンドボックスの構築に使用しましょう。こちらも`Configuration`の子ノードに記述します。多いので、よく使うものを一部だけ紹介します。

### GPUの無効化
`<vGPU>Disable</vGPU>`
GPUを無効化しても画面が映らなくなるといった事はなく、WindowsにはWindows Advanced Rasterization Platformと呼ばれる代替コンポーネントによってCPUが描画を担うため、CUDA(GPGPU)を使ってるでもない限りは、動かなくなるアプリケーションは殆ど無いと思います（逆に言えばそういったプログラムのフォールバックを試せます）

### ネットワークの無効化
`<Networking>Disable</Networking>`
インターネットが繋がらなくなるだけでなく、ネットワークアダプタが一つもない状態になるので、たまに初期化に失敗するアプリケーションが出てきます（アダプタをforして1つ取り出すみたいな処理を書いてる等）

### メモリ量の調整
`<MemoryInMB>4096</MemoryInMB>`
昨今はドライバでも書かない限りはあまり気にする必要は無いですが、Windows 11の最低要件以下（1GBくらいならギリギリ）でも動くので、Out Of Memoryの挙動確認に使うことが出来るでしょう。

### 起動直後に実行するコマンド
```
<LogonCommand>
  <Command>c:\host_sandbox\dotnet-sdk-9.0.101-win-x64.exe /install /quiet /norestart</Command>
</LogonCommand>
```
例として.NET Runtimeのサイレントインストールの例を書いてみました。`MappedFolders`で設定されたディレクトリにインストーラーを設置し、サイレントインストールを整備しておけば、Sandboxを起動後に、環境再現あれこれの操作を一々行う必要はありません。
`Command`は複数書けますが、.batを指定することもできるので、Sandboxに利用するだけでなく、環境構築は積極的にスクリプト化したいですね。

# 最後に
他のOSにあるサンドボックス環境同様、Windowsのアプリケーション開発に必要な機能が揃っていると思います。またこの機能がとてもスマートな形で実現されている事が[Microsoft Learnに掲載されていますので](https://learn.microsoft.com/en-us/windows/security/application-security/application-isolation/windows-sandbox/windows-sandbox-architecture)、ご興味がある方はぜひご一読下さい。

[^1]:以前までは英語版のWindowsが立ち上がっていた為、日本語で起動するのにひと手間必要でしたが、現在のSandboxはデフォルトでホストOSと同じ言語で立ち上がります
[^2]:再起動直後のインストールは「機能をカスタマイズしています。」が表示されたまま地味に時間が掛かるのでお気を付け下さい