Sanboxのログオンコマンドのデバッグ
Sandboxの使い方は人それぞれだろうから、必要なアプリケーションや設定も異なるはずだ。wingetのインストールなどは、すべてログオンコマンドからだと時間はかかるものの、手動操作なしに環境設定したSandboxが起動できる。
ただし、ログオンコマンドはコンソールウィンドウを表示しないため、デバッグが面倒になる。その場合はログオンコマンドで、スタートアップフォルダにバッチファイルをコピーし、起動したWindowsにこれを実行させるといい。
こうすることで、コンソールが表示され、PowerShellなどのデバッグ機能が利用できるようになる。ちゃんと動作するようになったら、ログオンコマンドに直接スクリプトを指定するのだが、ログオンコマンドは、コンソールが表示されない関係で、実行がエラーになるコマンドもあるので注意したい。
たとえば、add-appxpackageコマンドは、プログレスバーを「$ProgressPreference="SilentlyContinue"」で停止させないとウィンドウが表示されていないコンソールでは実行できない。
cmd.exeのバッチファイルは、無設定で実行可能であり、スタートアップフォルダに入れるだけで自動的に起動できる。実行タイミングは、デスクトップが表示され、ユーザー環境が動き出したときになる。
具体的には、以下のリストようなwsbファイルを使う。
<Configuration>
<MappedFolders>
<MappedFolder>
<HostFolder>D:\temp</HostFolder>
<SandboxFolder>C:\temp</SandboxFolder>
</MappedFolder>
</MappedFolders>
<LogonCommand>
<Command>cmd.exe /c copy "C:\temp\Logon2nd.bat" "C:\Users\WDAGUtilityAccount\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup" </Command>
</LogonCommand>
</Configuration>
このwsbファイルでは、ホスト側のD:\tempを、Sandbox側のC:\tempにマウントさせている(以下、この設定で解説する)。以下のスクリプトで参照しているファイルはすべてホスト側ではD:\tempに置き、スクリプト内では、C:\temp以下としてアクセスする。
ログオンコマンドは、単にファイルを、Sandbox標準ユーザー(WDAGUtilityAccount)のスタートアップフォルダにコピーしている。起動後、スタートアップフォルダが処理され、バッチファイルが起動する。
バッチファイル(C:\temp\Logon2nd.bat)は、以下のようなものになっている。
powershell.exe -ExecutionPolicy Bypass -File C:\temp\logoncommand.ps1
PowerShell.exeが実行するコマンドは、以下のリストのようなものだ。
# Set-PSDebug -Trace 1
$x=Get-WinUserLanguageList
if($x.LanguageTag -notcontains "ja"){
$x.Insert(0,"ja-JP")
Set-WinUserLanguageList -Force -LanguageList $x
# read-host "Enter to restart"
# Windows Sandboxを再起動して言語設定を有効にする
shutdown.exe /f /r /t 0
}
$ProgressPreference="SilentlyContinue"
# パスを環境に合わせて書き換えること
add-appxpackage "C:\temp\Microsoft.VCLibs.x64.14.00.Desktop.appx"
add-appxpackage "C:\temp\Microsoft.DesktopAppInstaller_8wekyb3d8bbwe.msixbundle"
C:\temp\PowerShell-7.3.5-win-x64.msi /quiet
winget install Microsoft.WindowsTerminal.Preview --accept-source-agreements --accept-package-agreements --silent --disable-interactivity
copy "C:\temp\settings.json" "C:\Users\WDAGUtilityAccount\AppData\Local\Packages\Microsoft.DesktopAppInstaller_8wekyb3d8bbwe\LocalState"
winget configuration "C:\temp\DevMode.yaml" --accept-configuration-agreements
wt.exe
Set-PSDebug -off
read-host "Enter"
最初の部分では、言語リストの先頭に日本語を置き、再起動している。注意するのは再起動後に再び、ログオンスクリプトが動作する点だ。このため、再起動を行うログオンスクリプトやそこから起動するプログラムは、2回実行されても問題ないように作る必要がある。それがリストの3行目にあるif文の役目である。
再起動後は、言語リストに「ja」が含まれるため、言語リストは書き換えず、再起動もしない。なお、2行目から9行目を削除あるいは注釈化することで、日本語への切替をしないようにできる。
winget configureでは、開発者モードをオンにしている。yamlファイルは以下のリストのようになる(前回解説したものの一部を利用)。
properties:
resources:
- resource: Microsoft.Windows.Developer/DeveloperMode
directives:
description: Enable Developer Mode
allowPrerelease: true
settings:
Ensure: Present
configurationVersion: 0.2.0
環境設定が自動でできると、Sandbox利用の敷居が下がる。初期設定スクリプトを完成させるのが少し面倒だが、1度完成すれば、あとは自動で処理されるため、初期化が終了するまで放置しておけばいい。Sandboxは仮想環境に比べるとリソース消費が小さく、終了させればきれいな状態に戻るので、アプリなどのテストに利用できる。また、日本語環境内で簡単に英語環境を起動できるため、アプリの国際化対応の評価などにも対応できる。

この連載の記事
-
第508回
PC
Scalable Vector Graphics(SVG)そもそも何なのか? -
第507回
PC
Windows 11の「開発者モード」とは何か? -
第506回
PC
Windows 11は早くも来秋登場の26H2プレビューの準備が始まる -
第505回
PC
結構変化しているWindows 11のエクスプローラーの基本設定を見直す -
第504回
PC
新しいOutlookとOutlook Classic、そろそろ古いOutlookとExchangeの組み合わせは引退の頃合いか -
第503回
PC
機能が増えたこともあり、寄せ集めから統合化に進むWindowsの便利ツール「PowerToys」 -
第502回
PC
Windows 11でBluetoothのオーディオ新規格「Bluetooth LE Audio」を試す -
第501回
PC
Windows 11 Ver.25H2での変更点、新機能を整理する -
第500回
PC
Windows 11 Ver.25H2が完成した -
第499回
PC
Windowsでの致命的だが回復可能なエラーに備える手段を2つ紹介 -
第498回
PC
Windows Terminalの安定版V1.23が公開 設定UIが改良される - この連載の一覧へ











