🪟

Win32 App IsolationとWinUIでセキュアかつモダンなWindowsアプリを開発する - Visual Studio

に公開

Environment

  • Windows 11 24H2
  • Visual Studio 2026

あらすじ

Windowsアプリケーションは基本的にサンドボックス化されていません。
ブラウザなどは整合性レベル(IL)を下げたプロセスでリスクの高い処理を行うことである程度ホストから分離していますが、macOSのApp Sandboxに相当するアプリ全体をサンドボックス化する仕組みはあまり普及していません。

以前はUWPがこれを実現していましたが、最近推奨されていない方向性になりました。
https://learn.microsoft.com/ja-jp/windows/uwp/get-started/universal-application-platform-guide

これに代わる技術として、WinUI 3 と Win32 App Isolation を使って、サンドボックス化されたアプリを作成する方法を紹介したいと思います。
https://learn.microsoft.com/ja-jp/windows/win32/secauthz/app-isolation-overview

注意点

新規プロジェクトの場合、MSIXからAppContainerを直接使用するのが最も堅牢な方法だと思います。
https://zenn.dev/nexryai/articles/68d80b025820cb

プロジェクト作成

ここで間違えて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になってる場合、これらを確認してみると役立つかもしれません。
https://learn.microsoft.com/en-us/windows/win32/secauthz/app-isolation-packaging-with-vs

Discussion