3.

MSI ファイル(.msi)とは | Windows Installer・msiexec・OLE 構造化ストレージ

編集
この記事の要点
  • .msi は Microsoft Installer が定めた Windows 標準のインストーラパッケージ形式
  • 実体は OLE 構造化ストレージ(複合ドキュメント)で、内部に複数のテーブル(File / Component / Feature 等)を持つ
  • コマンドラインは msiexec /i package.msi。アンインストールは msiexec /x、サイレントは /qn
  • トランザクション方式でインストールされ、失敗時は自動ロールバック。Group Policy で全社配布も可能
  • ログ取得は msiexec /i app.msi /l*v install.log で詳細ログを出力できる

概要

.msi(Microsoft Software Installer / Microsoft Installer Package)は、Windows でアプリケーションをインストール・アンインストール・修復・更新するために設計された標準パッケージ形式です。Windows Installer サービス(msiserver)がこのファイルを解釈し、ファイルコピー、レジストリ書き込み、ショートカット作成、サービス登録などを実行します。

従来の .exe 形式のセットアップは作者ごとに独自仕様で、アンインストール時に何が削除されるか不透明でした。MSI はこれを 宣言的に記述する枠組みを導入し、「どのファイルがどのコンポーネントに属し、どのフィーチャに含まれ、どの条件で入るか」をすべてテーブルで管理します。これにより:

  • 失敗時の自動ロールバック(トランザクション)
  • 修復インストール(壊れたファイルだけ再展開)
  • Group Policy による全社一括配布
  • サイレントインストール(GUI を出さずに展開)

といった企業用途で重要な機能が標準化されました。現在では Office、SQL Server、Visual Studio 関連、各種ドライバなど、エンタープライズ向け製品の多くが MSI で配布されています。

内部構造

.msi ファイルは外見こそ単一ファイルですが、中身は OLE 構造化ストレージ(Compound File Binary Format、CFBF)と呼ばれる「ファイルシステムを模した複合ドキュメント」です。これは Word の旧 .doc や Excel の旧 .xls と同じ仕組みで、ファイル内に複数の「ストリーム(仮想ファイル)」を格納できます。

主なストリーム / テーブル:

  • Property テーブル: ProductCode、ProductVersion、Manufacturer、UpgradeCode などのメタ情報
  • File テーブル: インストール対象のファイル一覧(名前、サイズ、バージョン、ハッシュ)
  • Component テーブル: ファイル・レジストリ・ショートカットを束ねた最小単位。GUID で一意
  • Feature テーブル: ユーザに見せる機能単位。Component の集合
  • Directory テーブル: インストール先ディレクトリのツリー定義
  • Registry テーブル: 書き込むレジストリエントリ
  • CustomAction テーブル: 標準では足りない処理を VBScript / JScript / DLL で記述
  • InstallExecuteSequence: インストール時に実行するアクションの順序
  • 埋め込み CAB: 実ファイルは内部 CAB として圧縮格納されることが多い

これらは Orca(Windows SDK 付属)や InstEd といったツールで開いて、表として閲覧・編集できます。

主な用途

  • 商用アプリの配布: Office、Adobe、各種開発ツール
  • ドライバインストール: プリンタ、特殊デバイス
  • 社内アプリの自動配布: Group Policy(GPO)で OU 単位に MSI を割り当て、ログオン時に自動展開
  • SCCM / Intune 連携: 大規模端末管理で配布パッケージとして利用
  • 修復シナリオ: ユーザが誤って DLL を削除しても、コントロールパネルの「変更」→「修復」で再展開

関連形式との比較

形式役割特徴
.msiインストーラパッケージ宣言的、トランザクション、GPO 対応
setup.exeインストーラ実行ファイル独自実装。内部で .msi を呼ぶことも多い
.msuWindows Update スタンドアロンOS パッチ専用。内部に .cab
.mspMSI パッチ既存 MSI への差分適用
.appx / .msixモダンパッケージサンドボックス化、Store 配信向け
.deb / .rpmLinux パッケージ依存関係解決を OS のパッケージマネージャが担当

コマンド・ツール

  • 標準インストール: msiexec /i app.msi
  • サイレントインストール: msiexec /i app.msi /qn /norestart
  • アンインストール: msiexec /x app.msi または msiexec /x {ProductCode-GUID}
  • 修復: msiexec /fa app.msi(a=全部、p=不足のみ、e=同等以下のバージョンで上書き等)
  • 詳細ログ: msiexec /i app.msi /l*v install.log
  • プロパティ指定: msiexec /i app.msi INSTALLDIR="C:\Apps\Foo"
  • Orca: MSI テーブルを GUI で編集(Windows SDK 付属)
  • WiX Toolset: XML から MSI をビルドするオープンソースツールチェーン
  • Advanced Installer / InstallShield: 商用 MSI オーサリングツール
  • PowerShell: Get-Package | Where-Object ProviderName -eq "msi" で MSI 起源のインストール済み一覧

注意点

  • 管理者権限: ほとんどの MSI は per-machine インストールで、UAC 昇格が必要。per-user 配置もできる
  • UpgradeCode の継承: バージョンアップ時は ProductCode は変えても UpgradeCode は固定にする。これが変わると「別製品」と認識され、旧版が残ってしまう
  • CustomAction の落とし穴: VBScript で書いた CustomAction が失敗するとロールバックが連鎖し、原因究明が困難。可能な限り標準アクションで完結させる
  • 署名: MSI にも signtool でコード署名を付けるべき。署名がないと SmartScreen に警告される
  • 32bit / 64bit MSI: Template Summary プロパティで指定。64bit MSI は 64bit Windows でしか動かない
  • ICE 検証: WiX/Orca に含まれる Internal Consistency Evaluators で、テーブル整合性を事前検査する習慣を付ける

関連リンク

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. EXE(.exe)
  2. DLL(.dll)
  3. MSI(.msi)
  4. DMG(.dmg)
  5. DEB(.deb)
  6. RPM(.rpm)
  7. APK(.apk)
  8. IPA(.ipa)
  9. AppImage(.appimage)
  10. app(.app)

最近更新/作成されたページ