🦊

Windows Sandbox触ってみた

2022/10/06に公開1

概要

Windows SandboxはWindows 10で使えるクリーンインストール状態のWindows仮想環境(サンドボックス環境)です。

※Windows11環境は現在この記事のスコープ外です

動作環境

Windows 10 Professional以上のエディション
(Windows 10 Homeは利用不可)

インストール手順

  1. コントロールパネル->プログラム->Windowsの機能の有効化あるいは無効化
  2. Windowsサンドボックスにチェック
  3. 再起動

使い方

  1. .wsbファイルを作成して実行
  2. pywinsandboxを利用して実行する

.wsbファイル

.wsbファイルの設定例

.wsbファイルにXML形式で設定を記述する.
.wsbファイルをダブルクリックすると設定した内容でWindows Sandoboxが起動します.
設定の詳細はこちらを参照
https://docs.microsoft.com/ja-jp/windows/security/threat-protection/windows-sandbox/windows-sandbox-configure-using-wsb-file

<Configuration>
  <VGpu>Disable</VGpu>
  <Networking>Disable</Networking>
  <MappedFolders>
    <MappedFolder>
      <!-- ディレクトリは絶対パス指定のみ可 -->
      <HostFolder>C:\Users\user\Desktop\hello_world</HostFolder>
      <!-- マウント先ディレクトリ. 未指定の場合デスクトップにマウントされる -->
      <SandboxFolder>C:\Users\WDAGUtilityAccount\Desktop\sandbox</SandboxFolder>
      <ReadOnly>false</ReadOnly>
    </MappedFolder>
  </MappedFolders>
</Configuration>

.wsbファイルの代わりにpywinsandboxを利用する

pywinsandboxインストール

pip install pywinsandbox
# conda環境の場合はcondaのpywin32を削除し、pip版pywin32を追加インストールしてください

設定例 (.wsbファイルと比べると設定項目は少ないですがディレクトリ指定で相対パスが使える等のメリットがあります)
詳細はこちら参照
https://github.com/karkason/pywinsandbox

import os
import winsandbox

sandbox = winsandbox.new_sandbox(
    folder_mappers=[winsandbox.FolderMapper(os.getcwd())],
    networking=False,
    logon_script=f"explorer"
)

注意事項
バージョン1.2.0ではREADMEに書いてある sandbox.rpyc.modules のAPIを使用するとエラーが出ることがあるようです.
https://github.com/karkason/pywinsandbox/issues/14

ざっくりどんな設定ができるか。

.wsbファイルやpywinsandboxを使うことで仮想環境の詳細設定をすることができます。
Logonコマンドを設定することでWindows Sandboxの環境構築等の利用をすることができるかと思います。

設定項目 概要
仮想GPU DirectXで使用する仮想GPU※CUDA使用不可
ネットワーク 仮想環境のネットワーク設定
マップされたフォルダー ホストのディレクトリを仮想環境にマウントreadonly設定可
クリップボード ホストとクリップボードの共有設定
メモリ設定 仮想環境のメモリ設定
Logon コマンド サンドボックス起動時に仮想環境側で実行する実行するコマンド

Discussion

ギンギツネさんギンギツネさん

記事を書いておいてアレですが、ガッツリ自動化したいならTerraform + Docker Windowsインスタンス + chocolatey使った方が環境構築が楽かもしれないです。

Windows Sandbox環境で自動でスクリプト実行させるにはバッチスクリプト or PowerShellでLoginスクリプト書かないといけないですので。