Skip to content

MS_WindowsInstaller

nishi_74322014 edited this page Aug 12, 2026 · 1 revision

Microsoft Windows Installer

概要

Windows でソフトウェアのインストール・メンテナンス・削除を行うエンジン。

  • ZIP、XCOPYと並ぶ、原始的な展開方法。

  • アプリケーションだけでなく、ライブラリ、パッケージを配布することもできる。

補足(現在の位置付け): Windows Installer(MSI)は
メンテナンス モードの技術であり、機能追加は行われていない
(エンジンのバージョンは Windows 10 以降 5.0 のまま)。
ただし、以下の理由から現役で広く使われ続けている。

  • 企業内配布(Active Directory のグループ ポリシー、SCCM / Intune)が MSI 前提
  • サイレント インストール(/qn)と管理者による一元管理が確立している

Microsoft が推す新しい配布形式は MSIX(後述の補足を参照)。

特徴

GUIフレームワーク

デプロイメント機能の強化

  • アドバタイズ
  • オンデマンド
  • 管理インストール
  • UAC
  • アプリケーションをネットワーク共有から直接実行できる(ローカルへのコピーは不要)。

アンインストール

アンインストール シーケンスの自動生成によるロールバック。

テスト・デバッグ

  • ICE による検証
  • 詳細なロギング機能

コンパーチブル

他のインストーラ フレームワークと置き換え可能。

ファイル

MSIファイル

概要

  • デフォルトのファイル拡張子が "MSI" であることから MSI ファイルと呼ばれる。

  • MSI ファイルは、セットアップ・プロジェクトやインストール・パッケージとも呼ばれる。

  • MSI ファイルには、

    • インストール処理に関する情報と
    • インストールされるファイルとが

    パッケージングされている。

種類

Visual Studio のセットアップ プロジェクトには、以下の 2 種類がある。

  • セットアップ プロジェクト

    • Windows ベースのアプリケーションのインストーラを作成する。
    • ターゲット コンピュータの [Program Files] ディレクトリにファイルをインストール。
  • Web セットアップ プロジェクト

    • Web アプリケーションのインストーラを作成する。
    • Web サーバー上の仮想ルート ディレクトリにファイルをインストール。

補足(最新化:Visual Studio のセットアップ プロジェクト):
セットアップ プロジェクト(*.vdproj)は Visual Studio 2012 で製品から削除され、
その後は Marketplace 拡張機能
「Microsoft Visual Studio Installer Projects」 として提供されている
(Visual Studio 2022 用も公開されている)。

ただし、機能は当時のまま拡張されていないため、
新規に MSI を作るのであれば WiX Toolset(現在の主流。v4/v5 は
dotnet tool install --global wix で導入できる)を選ぶことが多い。
Web セットアップ プロジェクトについては、現在は
Web Deploy(msdeploy)や CI/CD パイプラインによる発行が一般的で、
MSI で Web アプリを配布する構成自体がほぼ使われない。

特徴

  • 内部的には数十個の RDB の Table からなる OLE 構造化ストレージ ファイルである。

MSMファイル

概要

  • MSM ファイルは、マージ・モジュールとも呼ばれる。
  • DLL などの再利用できるコンポーネントをパッケージ化できる。
  • マージ モジュールは単独でインストールできず、MSI ファイルのコンテキストの中で使用する。

移行メモ(正誤): 元ページは「MSI ファイルは、マージ・モジュールとも呼ばれる」と
記述しているが、この節の見出しのとおり
マージ・モジュールと呼ばれるのは MSM ファイルである。

用途

  • 特定のコンポーネントの依存情報をすべて取り込むことができるため、正しいバージョンをインストールできる。
  • バージョン管理の問題を回避するために、複数のアプリケーションで共有されるコンポーネントやファイルについては、必ずマージ モジュールを使用する。

注意

  • 一度配布したマージ モジュールは修正しない。
  • コンポーネントのバージョン毎に新しいマージ モジュールを作成する。

CABファイル

用途

Web サーバーから Web ブラウザにダウンロードできる ActiveX コンポーネントをパッケージ化する。

機能

CAB ファイルでは、

  • 圧縮レベルの指定
  • Authenticode 署名機能の実装
  • 表示名とバージョン情報の設定
  • Web における依存ファイルの場所の指定

などを行うことができる。

補足(最新化): ここでの CAB プロジェクトの用途は
Internet Explorer の <object codebase="..."> による ActiveX 配布を前提としたもの。
ActiveX 自体が現行ブラウザで動作せず、
Internet Explorer は 2022 年 6 月にサポートを終了しているため、
この用途は完全に過去のものである。
なお CAB ファイル形式自体は、
ドライバ パッケージや MSI の内部圧縮形式として現在も使われている。

MSIファイルの論理構造

  • 1 つの「MSI パッケージ」で、複数の「プロダクト」をインストールが可能で、
  • 1 つの「プロダクト」は、複数の「コンポーネント」からなる。

また、

  • 1 つの「機能」は、複数の「サブ機能」からなり、
  • 1 つの「サブ機能」は、複数の「コンポーネント」からなる。

プロダクト

  • 単独で動作する一つのプログラム
  • GUID で識別される。

コンポーネント

  • プロダクトを構成する最小単位
  • GUID で識別される。

  • ファイル

    • EXE
    • DLL
    • リソース
  • ディレクトリ

  • COM コンポーネント

  • レジストリ キー

  • ショートカット

  • およびその他のデータ

キーパス

パッケージの製作者がそのパッケージに必須であると指定したファイル等のこと。

キーパスには

  • ファイル
  • レジストリ キー
  • ODBC データソース

が指定できる。

  • キーパスにはファイルを指定するのが一般的であるため、キーファイルとも呼ばれる。

  • コンポーネントが持つことのできるキーパスは 1 つだけで、
    複数のコンポーネントが同じキーパスを持つことはできない。

  • コンポーネントのキーパスを明示しなかった場合は、
    コンポーネントのインストール先のディレクトリがキーパスとなる。

補足(コンポーネント規則): コンポーネントの GUID は
「1 コンポーネント = 1 キーパス」かつ「同じリソースには常に同じ GUID」
という規則で運用する必要がある。
この規則を破ると、

  • アップグレード時にファイルが消える
  • アンインストール時に他製品と共有しているファイルが消える
  • 参照カウントが壊れて自動修復が無限に走る

といった、原因追跡が困難な障害を招く。
MSI の設計で最も事故が多いのがこの部分である。

機能

  • 一つの「機能 (feature)」は複数の「コンポーネント」からなる。

  • 機能はコンポーネントを階層的にまとめた構造である。

    • 機能の中に機能を入れ子にできる。
    • 他の機能に含まれる機能を「サブ機能 (subfeature)」と呼ぶ。
  • ほとんどのソフトウェアでは、パッケージは単一の機能からなる。

  • 大規模なインストール プログラムでは通常、

    • 実行時にカスタム セットアップ ダイアログが表示され、
    • ユーザがインストール・アンインストールする機能を選択できるようにしている。

セットアップ処理

UIシーケンス

  • インストール先のシステムの状態を取得し、
  • インストール ウィザードを表示し、
  • インストールのオプションをユーザーに選択させる。

※ UI シーケンス中では、システムに対する変更は一切行われない。

実行シーケンス

実行フェーズではシステムに変更が加えられる一方、ユーザ インタフェースは一切表示されない。

  • 即時実行モード

    このステップでは、Windows Installer は、ユーザもしくはアプリケーションからプロダクトのインストール・アンインストールに必要な命令を受け取る。リクエストが発行されるとアクション (action) のシーケンス (sequence) が実行され、データベース内の情報から、遅延実行モードで行うべき処理を記述したスクリプトが内部的に構築される。

  • 遅延実行モード

    このステップでは、即時実行モードで構築されたスクリプトが実行される。スクリプトは Windows Installer サービスが動作しているアカウント(LocalSystem アカウント)で実行される。非特権ユーザーがインストールを行う場合は特権ユーザへの昇格が必要になる。

補足(カスタム アクションを書くときの注意): この 2 つのモードの違いは、
カスタム アクションを実装する際に必ず意識する必要がある。

観点 即時実行モード 遅延実行モード
実行タイミング スクリプト構築時 スクリプト実行時
権限 実行ユーザ LocalSystem(昇格済み)
プロパティ参照 すべて参照可能 CustomActionData 経由のみ
システム変更 行ってはならない ここで行う

遅延実行のカスタム アクションから
[INSTALLDIR] 等のプロパティを直接参照できない点がよくある落とし穴で、
即時実行のカスタム アクションで
CustomActionData にセットして受け渡す必要がある。

ロールバック

  • アンインストール シーケンスの自動生成によりロールバックが可能。

    • インストールが失敗した場合(インストール先コンピュータに必要なバージョンのオペレーティング システムが存在していない場合など)、インストールは自動生成されたアンインストール シーケンスによってロールバックされ、コンピュータはインストール前の状態に戻る。

    • パッケージの作者がシステムに変更を加えるカスタム アクションを作成する場合は、対応するロールバック アクションも作成する必要がある。

    • このメカニズムによって、アンインストールが失敗した場合(失敗する場合)のリカバリのために再インストールが必要になる。

自動修復機能

  • キーパスに指定されたファイルやレジストリ キーが存在するかチェックする。
  • チェックの結果と MSI パッケージの情報との間に不整合があった場合、関連する機能の再インストールが行われる。

補足(自動修復が暴発するケース): 自動修復(self-healing)は
アドバタイズされたショートカットや COM の起動時にトリガされるため、
コンポーネント規則を破っているパッケージでは
アプリを起動する度にインストーラが起動するという症状になる。
この場合、イベント ログ(MsiInstaller、イベント ID 1001/1004)に
どのコンポーネント(Product / Feature / Component の GUID)が
修復対象になったかが記録されるので、そこから原因を特定する。

その他の機能

アドバタイズ

アドバタイズとは

製品をアドバタイズすると、

  • ユーザーからは製品がインストールされたように見えるが、
  • 実際のインストールは製品が初めて起動されるときに実行される。

アドバタイズする方法

  • グループ ポリシー またはその他のデプロイメント機構を使用するか、

  • msiexec.exe を下記オプション付きで実行する。

    • /jm(すべてのユーザに対してアドバタイズ)
    • /ju(現在のユーザに対してアドバタイズ)

オンデマンド

オンデマンドでのインストールに指定された機能は
ユーザーが使用しようとした時点で初めてインストールされる。

管理インストール

  • 管理インストールでは非圧縮の状態の製品のイメージが作成される。

  • 主にアプリケーションをネットワーク ドライブからインストールまたは実行する際に用いられる。

  • Office をネットワーク ドライブからインストールする際に「管理インストール」を使用している。

  • 管理インストールを行うには、msiexec.exe/a オプション付きで実行する。

補足(最新化): Office については、
Office 2016 以降の主流であるクイック実行(Click-to-Run)版は MSI ベースではなく、
管理インストールは使用できない。
現在は Office 展開ツール(ODT)と configuration.xml で配布する。

UAC

  • Windows Vista に同梱されている Windows Installer 4.0 には、UAC と連携するための機能が盛り込まれている。
  • MSI パッケージを管理者権限が不要であるとマークすれば、ユーザは管理者資格情報のプロンプトを表示せずにパッケージをインストールできる。

ICE による検証

MSI データベースの潜在的な問題を検出する。

  • マイクロソフトは、Internal Consistency Evaluators (ICE) を提供している。
  • InstallShield では、スイート製品に InstallShield ICE を同梱提供している。

補足(実行方法): ICE は Windows SDK に含まれる msival2.exe
*.cubdarice.cub 等)で実行する。
WiX を使う場合は、ビルド時に自動で ICE 検証が走る
(v3 では light.exe、v4/v5 では wix build に統合されている)。

診断用ロギング機能

強力な診断用ツールとして詳細なロギング機能をサポートしている。

  • コマンドライン
    /L オプションを指定するとロギングが有効になる。

  • レジストリ
    レジストリに次の値を設定すると詳細なロギングが有効になる。

    • キー: HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\Installer
    • 名前: Logging
    • 種類: REG_SZ
    • データ: voicewarmup

補足(voicewarmup の読み方): voicewarmup は覚えやすい語呂であって
意味のある単語ではなく、各文字が個別のログ オプションを表している。

文字 内容
v 詳細(verbose)出力
o ディスク空き容量不足のメッセージ
i 状態メッセージ
c 初期 UI パラメータ
e すべてのエラー メッセージ
w 致命的でない警告
a アクションの開始
r アクション固有のレコード
m メモリ不足または致命的な終了
u ユーザー要求
p ターミナル プロパティ

コマンド ラインでは以下のように使う(*v/x 以外のすべて)。

msiexec /i Setup.msi /l*v setup.log

トラブル解析では、まずログ内を Return value 3 で検索し、
その直前のアクションを見るのが定石。

Orcaデータベース・エディタ

Windows インストーラ パッケージ (.msi) ファイルを直接編集するツール。

補足(入手方法): Orca は Windows SDK の「MSI Tools」コンポーネント
Orca-x86_en-us.msi として同梱されており、SDK をインストールした後に
このファイルを実行して導入する。
元ページが挙げていた非公式配布サイトは現存しないため、リンクを削除した。

参考

  • Microsoft Windows Installer - Wikipedia
    https://ja.wikipedia.org/wiki/Microsoft_Windows_Installer

  • Windows インストーラ配置(Visual Studio 2008 当時のドキュメント)

    • Windows インストーラ配置の概要
      • 配布可能なメディアによる配置 / Web Setup プロジェクトの配置 / 配置の代替手段
      • セットアップ/配置プロジェクト / セットアップ プロジェクト / Cab ファイル プロジェクト / マージ モジュール プロジェクト
    • Windows インストーラでの配置の概念
      • Windows Vista の Windows インストーラ配置 / Microsoft Windows インストーラの技術的な背景情報
      • マージ モジュールの概要 / 配置の必要条件 / インストーラとマージ モジュールの使い分け / 再ターゲット可能なマージ モジュール
      • ファイル、フォルダ、および配置 / 配置と関連付け / 配置と Authenticode 署名 / 配置と依存関係 / 配置とローカリゼーション
      • 配置とレジストリ / 配置とランタイム ユーザー インターフェイス / 配置とグローバル アセンブリ キャッシュ
      • カスタム動作 / 管理用インストール / 条件付き配置 / 配置の条件 / 配置のダイアログ ボックス / インストール ダイアログ ボックスの制限事項
    • Windows インストーラ配置のタスク
      • 必須コンポーネントのインストール / 配置プロジェクトの作成・追加 / マージ モジュールの登録 / アイコンの追加と削除
      • オペレーティング システムのバージョンに基づく条件付きインストール / ユーザーの選択に基づく条件付きインストール
      • 64 ビット プラットフォーム用の Windows インストーラの作成 / トラブルシューティング / 配置で使用するエディタ
    • Windows インストーラでの配置に関するチュートリアル
      • Windows ベースのアプリケーションの配置 / マージ モジュールを使用した共有コンポーネントのインストール
      • カスタム動作の作成 / インストール時のメッセージの表示 / インストール時のアセンブリのプリコンパイル
      • インストール時のデータベース作成 / インストール時のアプリケーションの Web サービスへのリダイレクト
  • Msiexec.exe のコマンドライン オプション
    https://learn.microsoft.com/ja-jp/windows-server/administration/windows-commands/msiexec

  • Windows Installer & InstallShield はまり道 - Lazy Diary @ はてな
    http://d.hatena.ne.jp/satob/20080225/p2

補足(最新化:MSI の後継としての MSIX):
現在 Microsoft が推奨する新しいパッケージ形式は MSIX である。

観点 MSI MSIX
インストール方式 任意の場所へ任意の変更 コンテナ化。ファイル/レジストリはリダイレクト
アンインストール カスタム アクション次第で残骸が残る クリーンな削除を保証
署名 任意(Authenticode 推奨) 必須
配布 GPO / SCCM / 直接実行 Microsoft Store / Intune / App Installer
対象 OS Windows 全般 Windows 10 1709 以降

既存の MSI/EXE は MSIX Packaging Tool で MSIX に変換できる。
ただし、サービスの登録やドライバのインストールを伴うものは
コンテナの制約により変換できないため、MSI を継続するケースも多い。
開発者向けツールの配布であれば、
winget(Windows Package Manager)のマニフェスト登録も選択肢になる。


Tags: 移行, デプロイ, その他、開発の色々

NetDevInfraWiki

マイクロソフト系技術情報 Wiki
Open 棟梁 Wiki

(未着手)

開発基盤部会 Wiki

移行管理: DONETODO

Clone this wiki locally