-
Notifications
You must be signed in to change notification settings - Fork 0
MS_WindowsInstaller
- 戻る(プログラムの配付技術)
- Microsoft Windows Installer
Windows でソフトウェアのインストール・メンテナンス・削除を行うエンジン。
-
ZIP、XCOPYと並ぶ、原始的な展開方法。
-
アプリケーションだけでなく、ライブラリ、パッケージを配布することもできる。
補足(現在の位置付け): Windows Installer(MSI)は
メンテナンス モードの技術であり、機能追加は行われていない
(エンジンのバージョンは Windows 10 以降 5.0 のまま)。
ただし、以下の理由から現役で広く使われ続けている。
- 企業内配布(Active Directory のグループ ポリシー、SCCM / Intune)が MSI 前提
- サイレント インストール(
/qn)と管理者による一元管理が確立しているMicrosoft が推す新しい配布形式は MSIX(後述の補足を参照)。
- アドバタイズ
- オンデマンド
- 管理インストール
- UAC
- アプリケーションをネットワーク共有から直接実行できる(ローカルへのコピーは不要)。
アンインストール シーケンスの自動生成によるロールバック。
- ICE による検証
- 詳細なロギング機能
他のインストーラ フレームワークと置き換え可能。
-
WISE (Wise Installation Studio)
(後のバージョンは Windows Installer ベースになっている)
-
デフォルトのファイル拡張子が "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 ファイルは、マージ・モジュールとも呼ばれる。
- DLL などの再利用できるコンポーネントをパッケージ化できる。
- マージ モジュールは単独でインストールできず、MSI ファイルのコンテキストの中で使用する。
移行メモ(正誤): 元ページは「MSI ファイルは、マージ・モジュールとも呼ばれる」と
記述しているが、この節の見出しのとおり
マージ・モジュールと呼ばれるのは MSM ファイルである。
- 特定のコンポーネントの依存情報をすべて取り込むことができるため、正しいバージョンをインストールできる。
- バージョン管理の問題を回避するために、複数のアプリケーションで共有されるコンポーネントやファイルについては、必ずマージ モジュールを使用する。
- 一度配布したマージ モジュールは修正しない。
- コンポーネントのバージョン毎に新しいマージ モジュールを作成する。
Web サーバーから Web ブラウザにダウンロードできる ActiveX コンポーネントをパッケージ化する。
CAB ファイルでは、
- 圧縮レベルの指定
- Authenticode 署名機能の実装
- 表示名とバージョン情報の設定
- Web における依存ファイルの場所の指定
などを行うことができる。
補足(最新化): ここでの CAB プロジェクトの用途は
Internet Explorer の<object codebase="...">による ActiveX 配布を前提としたもの。
ActiveX 自体が現行ブラウザで動作せず、
Internet Explorer は 2022 年 6 月にサポートを終了しているため、
この用途は完全に過去のものである。
なお CAB ファイル形式自体は、
ドライバ パッケージや MSI の内部圧縮形式として現在も使われている。
- 1 つの「MSI パッケージ」で、複数の「プロダクト」をインストールが可能で、
- 1 つの「プロダクト」は、複数の「コンポーネント」からなる。
また、
- 1 つの「機能」は、複数の「サブ機能」からなり、
- 1 つの「サブ機能」は、複数の「コンポーネント」からなる。
- 単独で動作する一つのプログラム
- GUID で識別される。
- プロダクトを構成する最小単位
- GUID で識別される。
-
ファイル
- EXE
- DLL
- リソース
-
ディレクトリ
-
COM コンポーネント
-
レジストリ キー
-
ショートカット
-
およびその他のデータ
パッケージの製作者がそのパッケージに必須であると指定したファイル等のこと。
キーパスには
- ファイル
- レジストリ キー
- ODBC データソース
が指定できる。
-
キーパスにはファイルを指定するのが一般的であるため、キーファイルとも呼ばれる。
-
コンポーネントが持つことのできるキーパスは 1 つだけで、
複数のコンポーネントが同じキーパスを持つことはできない。 -
コンポーネントのキーパスを明示しなかった場合は、
コンポーネントのインストール先のディレクトリがキーパスとなる。
補足(コンポーネント規則): コンポーネントの GUID は
「1 コンポーネント = 1 キーパス」かつ「同じリソースには常に同じ GUID」
という規則で運用する必要がある。
この規則を破ると、
- アップグレード時にファイルが消える
- アンインストール時に他製品と共有しているファイルが消える
- 参照カウントが壊れて自動修復が無限に走る
といった、原因追跡が困難な障害を招く。
MSI の設計で最も事故が多いのがこの部分である。
-
一つの「機能 (feature)」は複数の「コンポーネント」からなる。
-
機能はコンポーネントを階層的にまとめた構造である。
- 機能の中に機能を入れ子にできる。
- 他の機能に含まれる機能を「サブ機能 (subfeature)」と呼ぶ。
-
ほとんどのソフトウェアでは、パッケージは単一の機能からなる。
-
大規模なインストール プログラムでは通常、
- 実行時にカスタム セットアップ ダイアログが表示され、
- ユーザがインストール・アンインストールする機能を選択できるようにしている。
- インストール先のシステムの状態を取得し、
- インストール ウィザードを表示し、
- インストールのオプションをユーザーに選択させる。
※ 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で配布する。
- Windows Vista に同梱されている Windows Installer 4.0 には、UAC と連携するための機能が盛り込まれている。
- MSI パッケージを管理者権限が不要であるとマークすれば、ユーザは管理者資格情報のプロンプトを表示せずにパッケージをインストールできる。
MSI データベースの潜在的な問題を検出する。
- マイクロソフトは、Internal Consistency Evaluators (ICE) を提供している。
- InstallShield では、スイート製品に InstallShield ICE を同梱提供している。
補足(実行方法): ICE は Windows SDK に含まれる
msival2.exeと
*.cub(darice.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で検索し、
その直前のアクションを見るのが定石。
Windows インストーラ パッケージ (.msi) ファイルを直接編集するツール。
- Orca データベース エディタを使用して Windows インストーラ ファイルを編集する方法
https://learn.microsoft.com/ja-jp/troubleshoot/windows-client/application-management/orca-database-editor-edit-windows-installer
補足(入手方法): 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 サービスへのリダイレクト
- Windows インストーラ配置の概要
-
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: 移行, デプロイ, その他、開発の色々
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。