Win32 App IsolationとWinUIでセキュアかつモダンなWindowsアプリを開発する - Visual Studio
Environment
- Windows 11 24H2
- Visual Studio 2026
あらすじ
Windowsアプリケーションは基本的にサンドボックス化されていません。
ブラウザなどは整合性レベル(IL)を下げたプロセスでリスクの高い処理を行うことである程度ホストから分離していますが、macOSのApp Sandboxに相当するアプリ全体をサンドボックス化する仕組みはあまり普及していません。
以前はUWPがこれを実現していましたが、最近推奨されていない方向性になりました。
これに代わる技術として、WinUI 3 と Win32 App Isolation を使って、サンドボックス化されたアプリを作成する方法を紹介したいと思います。
注意点
新規プロジェクトの場合、MSIXからAppContainerを直接使用するのが最も堅牢な方法だと思います。
プロジェクト作成
ここで間違えて3時間溶かしました。
普通にWinUIのプロジェクトを作成するのですが、必ず "WinUI 空のアプリ (Windowsアプリケーションパッケージプロジェクトでパッケージ化)"を選択してください。

普通のMSIX形式でパッケージングするときに使う "WinUI 空のアプリ (パッケージ化)"を選ぶと、正常にパッケージングできても実際にはAppContainerではなくMediumなILで動きます。
ターゲットプラットフォームを聞かれるので以下のように設定します。

マニフェスト設定
ソリューション エクスプローラーから "作成したプロジェクト名 (Package)" を選び、wapprojファイルのPropertyGroupに以下の内容を追記します。
<AppxOSMaxVersionTestedReplaceManifestVersion>false</AppxOSMaxVersionTestedReplaceManifestVersion>
続いてPackage.appxmanifestを開き、ビジュアルエディターで "信頼レベル" と "ランタイムの動作" をそれぞれAppContainer, AppSiloに変更します。

ソリューション エクスプローラーからPackage.appxmanifestを右クリックし、”コードの表示”を選び手動での調整を行います。
Dependencies
Dependenciesのデフォルトの内容を削除し、以下の項目のみにします。
<Dependencies>
<TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.26100.0" MaxVersionTested="10.0.26226.0" />
</Dependencies>
Applications
Id="App"のApplicationに以下の属性を設定/追加します。
EntryPointはデフォルトのものから置き換えてください。
EntryPoint="Windows.FullTrustApplication" uap18:EntryPoint="Isolated.App"
最終的なApplicationsは以下のようになるはずです。
<Applications>
<Application Id="App"
Executable="$targetnametoken$.exe"
EntryPoint="Windows.FullTrustApplication" uap18:EntryPoint="Isolated.App" uap18:TrustLevel="appContainer" uap18:RuntimeBehavior="appSilo">
<uap:VisualElements
DisplayName="App4 (Package)"
Description="App4 (Package)"
BackgroundColor="transparent"
Square150x150Logo="Images\Square150x150Logo.png"
Square44x44Logo="Images\Square44x44Logo.png">
<uap:DefaultTile Wide310x150Logo="Images\Wide310x150Logo.png" />
<uap:SplashScreen Image="Images\SplashScreen.png" />
</uap:VisualElements>
</Application>
</Applications>
実際に確認する
Visual Studioからプロジェクトを実行し、Process Explorerなどのツールから実際にプロセスがAppContainerで動いてることを確認します。

初期状態のプロジェクトではこの設定でAppContainerになりましたが、公式ドキュメントではここでは触れていない変更についても言及されています。
Mediumになってる場合、これらを確認してみると役立つかもしれません。
Discussion