社内配布の WPF アプリを MSIX+App Installer(.appinstaller)で展開していた環境で、「ms‑appinstaller プロトコルは無効化されています」と表示される――最近よく耳にする相談です。本稿ではブロックの理由と安全な回避策、さらに 0x80190194(VCLibs 参照ミス)まで含めて、現場でそのまま使える配布設計と具体的な手順・サンプルを詳解します。
背景と現象の整理
これまで多くの組織は、Windows Application Packaging Project(WAP)で WPF を MSIX 化し、.appinstaller を Web に置いて「自動更新を有効」にした サイドロード配布を採用してきました。ところが 2023 年以降のセキュリティ対応により、ブラウザからの 1 クリック実行を司っていた ms-appinstaller:// スキームが OS 側で既定無効化され、次の症状が発生します。
- ブラウザで
*.appinstallerを開くと「ms‑appinstaller プロトコルは無効化されています」の警告で停止。 - ファイルを直接ダウンロードして実行すると、0x80190194(依存パッケージが取得できない=HTTP 404 相当)。多くは Debug 版 Microsoft.VCLibs を参照していることが原因。
なぜブロックされるのか(要点)
ms-appinstaller:// は「Web 経由 1 クリック MSIX インストール」を可能にするプロトコルでしたが、悪用リスク低減のため既定無効化されました。結果として、ブラウザ → App Installer のハンドオフが遮断され、Web 上のリンクから直接インストールを起動できません。これは Windows 10/11 双方に影響し、Edge/Chrome といったブラウザで同様のブロックが発生します。
現実解:推奨されるサイドロード配布フロー
ブラウザ連携が塞がれた現在でも、App Installer(.appinstaller)自体は有効です。ユーザー体験を大きく損なわず、安全に自動更新を維持する定石フローは次の通りです。
最小手数のユーザー操作で導入する
- HTTPS で
*.appinstallerと MSIX/BUNDLE をホストする(Basic/NTLM などの認証環境でも可)。 - ユーザーには 「まずファイルを保存」してもらい、エクスプローラからダブルクリックするよう案内する。
(ブラウザ直開きはプロトコル無効で止まるため) - または PowerShell を許容できる環境では次の 1 行を案内する。
PowerShell.exe -ExecutionPolicy Bypass -Command ^
Add-AppxPackage -AppInstallerFile .\YourApp.appinstaller
IT 管理下端末なら自動導入まで持っていく
- グループポリシー:コンピューターの構成 → 管理用テンプレート → Windows コンポーネント → アプリ パッケージの展開 で以下を有効化
- 「信頼済みアプリのすべてのインストールを許可」
- 「Windows ストア アプリの開発を許可」またはサイドロードの許可(組織運用方針に合わせて)
- 証明書:発行に用いたコード署名証明書を 信頼された発行元/信頼されたユーザー ストアへ配布(GPO もしくは MDM)。
- Intune(MDM):MSIX を「ラインオブビジネス アプリ」として配布、もしくは PowerShell スクリプト で
Add-AppxPackage -AppInstallerFileを実行し自動化。
.appinstaller の正しい記述(安全な自動更新)
Web 経由 1 クリックが使えない今、.appinstaller は「ローカルから起動する更新チャネル記述子」として活かします。以下は実運用で扱いやすい最小構成例です。
<AppInstaller
Uri="https://example.contoso.local/app/YourApp.appinstaller"
Version="1.2.3.0"
xmlns="http://schemas.microsoft.com/appx/appinstaller/2018">
ポイントは次のとおりです。
- Version は .appinstaller 自身のバージョン。配布構成を変えたら上げる(キャッシュ更新のため)。
- MainBundle(または MainPackage) は MSIX/MSIXBundle の配布 URL。
- OnLaunch は起動時チェック。負荷と UX のバランスで
4〜24時間が現実解。 - Dependencies に アーキテクチャ別 Retail VCLibs を並べておくと、環境に合うものだけが取得されます。
依存パッケージ(Microsoft.VCLibs)の正しい扱い
0x80190194 で最も多いのは、Debug 版 VCLibs(Microsoft.VCLibs.x86.Debug.14.00.Desktop.appx など)を参照してしまっているケースです。運用では Retail(Release) のみを指定し、次の 3 つのいずれかで解決します。
- CDN の汎用 URL を直接指定(例:
https://aka.ms/Microsoft.VCLibs.x64.14.00.Desktop.appx)。 - 自社配布フォルダに Retail 版 appx を同梱し、
Dependenciesで 相対パス を指定(オフラインや閉域網に最適)。 - WAP プロジェクトで VCLibs を同梱(ソリューション エクスプローラー → パッケージ化プロジェクト → 依存関係から Microsoft.VCLibs.Desktop.14.00 を選択し、「常に含める/動的にダウンロード」を運用方針に合わせて設定)。
アーキテクチャ別の指定早見表
| 対象 OS/CPU | 推奨指定 | メモ |
|---|---|---|
| x64 | Microsoft.VCLibs.x64.14.00.Desktop.appx | 最も一般的 |
| x86 | Microsoft.VCLibs.x86.14.00.Desktop.appx | 32bit OS や 32bit ビルドが必要な互換環境 |
| ARM64 | Microsoft.VCLibs.arm64.14.00.Desktop.appx | Windows on ARM |
配布サーバ設計と配置のコツ
App Installer は 部分取得(Range) や再開ダウンロードを行うことがあります。静的配信の基本を押さえておきましょう。
- HTTPS 必須(自己署名でもよいが、社外配布は CA 署名推奨)。
- 配下の構成をバージョン別に分ける:例を下に示します。
/app/
/1.2.3.0/
YourApp_1.2.3.0_x86_x64.msixbundle
Microsoft.VCLibs.x64.14.00.Desktop.appx
Microsoft.VCLibs.x86.14.00.Desktop.appx
Microsoft.VCLibs.arm64.14.00.Desktop.appx
YourApp.appinstaller ← 常に最新を指す。MainBundle は上の固定 URL
この構成なら、.appinstaller は 常に最新 を指しつつ、過去版の MSIX を壊さず保持できます。アーカイブやロールバックにも強い運用です。
エラー別トラブルシュート(現場で効く対処)
| エラー | 原因の多く | 対処の要点 |
|---|---|---|
| 0x80190194 | 依存 appx の URL が 404/Debug 版を参照/認証でブロック | Retail 版を指定し直す/相対パス同梱/認証越しの取得可否を確認 |
| 0x800B0109 | 署名証明書が信頼されていない | 公開鍵(.cer)を 信頼された発行元/ユーザー ストアへ配布(GPO/MDM) |
| 0x80073CF3 | 依存関係不一致(VCLibs/Framework) | アーキテクチャと最小バージョンを見直し、Dependencies に漏れなく指定 |
| 0x80073D02 | 使用中のファイルがロック | 対象アプリや関連サービスを終了してから再実行 |
詳細追跡は イベント ビューアー → アプリケーションとサービス ログ → Microsoft → Windows → AppxPackagingOM → Microsoft-Windows-AppXDeployment/Operational を参照すると、欠落 URL や署名検証の失敗点が明確になります。
PowerShell による無人インストールの実例
閉域やプロキシ配下、Intune からの一斉導入で有効なエクスペリエンスです。
# VCLibs をローカル同梱するパターン(例)
$base = Split-Path -Parent $MyInvocation.MyCommand.Path
Add-AppxPackage -Path (Join-Path $base 'Microsoft.VCLibs.x64.14.00.Desktop.appx') -ErrorAction Stop
# アプリ本体は appinstaller でチャネル紐付け
Add-AppxPackage -AppInstallerFile (Join-Path $base 'YourApp.appinstaller') -ErrorAction Stop
はじめの 1 度だけこのスクリプトで導入すれば、以後は .appinstaller の OnLaunch バインドに従って自動更新されます。
署名証明書とセキュリティの実務
- 社内配布のみ:自己署名でも可。証明書は GPO/MDM で配布し、更新時のロールオーバー計画も用意。
- 社外配布:CA 署名のコードサイニング証明書推奨(EV で SmartScreen の警告を抑止しやすくなります)。
- 発行ビルドは必ず Release。Debug ビルドを指す参照(VCLibs や PDB)を混入させない。
Windows 10 と 11 の差異と共通設計
本稿のフローは Windows 10/11 共通です。UI 表示やストア版 App Installer のバージョン差でダイアログの文言が異なることはありますが、「ブラウザ直起動は不可」「ローカルから appinstaller を開く」という原則は同じです。
アップデート戦略の整理
| 方式 | 長所 | 短所 | 向く用途 |
|---|---|---|---|
| OnLaunch(本稿推奨) | 実装容易・確実。ユーザー操作に紐づくためトラブル時の切り戻しが容易 | 起動時に待ち時間が発生する場合がある | 業務アプリ全般 |
| 外部ジョブで強制配布(Intune/GPO) | 無人で確実に適用 | ネットワーク負荷、メンテナンスが重い | 規制の厳しい端末群 |
| Winget/Chocolatey | CLI による自動化・リポジトリ統合 | 準備(マニフェスト/内部源泉)が必要 | 開発端末や DevOps 向け |
Web からの 1 クリックを期待しない UX 設計
ユーザーへの案内文例です。ヘルプやポータルにそのまま載せられます。
1) 「ダウンロード」をクリックして YourApp.appinstaller を保存します。
2) 保存したファイルをエクスプローラで開きます(ダブルクリック)。
3) 表示される「インストール」ボタンを押します。以後、アプリ起動時に自動更新されます。
「ブラウザから直接開かないでください」と明記しておくと問い合わせが激減します。
よくある落とし穴と回避策
- 落とし穴:Debug 依存を残したまま公開
→ Release に切替・Retail VCLibs を再指定・出力フォルダを再配置。 - 落とし穴:認証ゲートの裏で VCLibs を外部 CDN に取りに行く
→ VCLibs を同梱し相対パスで解決。閉域網でも成功率が上がる。 - 落とし穴:
.appinstallerの Uri が自己参照していない
→ Uri は「.appinstaller 自身の在りか」を必ず指す。キャッシュ更新に必要。 - 落とし穴:更新間隔 0(毎回確認)でサーバ負荷
→ 4〜24 時間に調整。ピークをずらす。
配布方式の比較(意思決定の助け)
| 方式 | 初回導入 | 更新 | ネットワーク要件 | セキュリティ/統制 |
|---|---|---|---|---|
| MSIX+App Installer(本稿) | ローカルから .appinstaller を開く | OnLaunch で自動(ユーザー許可) | HTTPS/静的配信で可。CDN も良好 | 署名・依存制御が明快。監査しやすい |
| Intune LOB | 自動配信 | ポリシー次第で強制 | MDM 到達性が必要 | 企業統制が強い |
| Winget Private Repo | CLI/ポータルから導入 | マニフェストで制御 | リポジトリ公開が必要 | DevOps に適合 |
ビルドと署名のチェックリスト
- Configuration:Release(Any CPU/必要ならアーキ別)
- Package:Always bundle を有効にして
.msixbundleを作る - 証明書:期限・署名アルゴリズム(SHA-256)・タイムスタンプ有無を確認
- 依存関係:Microsoft.VCLibs.Desktop.14.00 の Retail のみ
- .appinstaller:Uri 自己参照、MainBundle/MainPackage の URL、UpdateSettings の間隔
- 配置:バージョン別ディレクトリ、古い版はアーカイブ参照可能に
FAQ(現場質問に即答)
Q. ブラウザから直接インストールできないの?
A. できません。プロトコルが既定無効のためです。ローカル保存 → 実行に切り替えてください。
Q. ユーザーに PowerShell を使わせたくない
A. 初回だけは ダブルクリックで足ります。運用で無人化したい場合は Intune/GPO で配布脚本を流します。
Q. VCLibs の URL を外に出したくない
A. 同梱(相対パス)にしましょう。閉域や認証配下でも安定します。
Q. 自動更新を強制にしたい
A. OnLaunch の ShowPrompt="false" で静かに適用できますが、組織の変更管理ポリシーに沿って告知・検証を挟む運用を推奨します。
サンプル一式(雛形としてどうぞ)
実務でコピペしやすいように、.appinstaller と PowerShell の最小セットをまとめておきます。
.appinstaller(最小構成)
<AppInstaller Uri="https://intra.example/app/YourApp.appinstaller"
Version="1.0.0.0"
xmlns="http://schemas.microsoft.com/appx/appinstaller/2018">
初回導入スクリプト(配布フォルダに同梱)
$ErrorActionPreference = 'Stop'
$base = Split-Path -Parent $MyInvocation.MyCommand.Path
# 証明書(任意:自己署名を同梱する場合)
# Import-Certificate -FilePath (Join-Path $base 'YourCA.cer') -CertStoreLocation Cert:\LocalMachine\Root
# 依存(同梱するなら相対パスで)
if (Test-Path (Join-Path $base 'Microsoft.VCLibs.x64.14.00.Desktop.appx')) {
Add-AppxPackage -Path (Join-Path $base 'Microsoft.VCLibs.x64.14.00.Desktop.appx')
}
# アプリ(appinstaller でチャネル紐付け)
Add-AppxPackage -AppInstallerFile (Join-Path $base 'YourApp.appinstaller')
結論(要点の再掲)
- ms‑appinstaller プロトコルは既定無効。ブラウザからの 1 クリックは使えない。
- しかし .appinstaller 自体は有効。ローカル保存 → 実行へ切替えれば Windows 10/11 で安定運用が可能。
- VCLibs は Retail(Desktop) を指す。Debug を参照すると 0x80190194 などの取得失敗になる。
- 企業運用では GPO/Intune で信頼源・証明書を事前配布し、無人インストール+自動更新の流れを整備する。
付録:実務ベストプラクティスまとめ
| 項目 | 推奨 | 理由 |
|---|---|---|
| ビルド構成 | Release/MSIX Bundle | Debug 依存混入を防ぎ、配布サイズと互換性を最適化 |
| 署名証明書 | 社内は自己署名可/社外は CA/EV | 導入時の警告回避と信頼連鎖の担保 |
| 自動更新間隔 | 4〜24 時間 | サーバ負荷と UX のバランスが良い |
| 依存の配布 | Retail VCLibs を CDN または同梱 | 取得失敗・閉域対応・安定性の向上 |
| フォルダ構成 | バージョンディレクトリ+最新版 .appinstaller | ロールバック容易・キャッシュ制御が明快 |
| 代替配布 | Intune/GPO/Winget 併用 | 無人化や統制強化に対応 |

コメント