Windows Server 2022 with PS 第12章

第12章: サードパーティー製アプリケーションの管理


1. この章で解説する主要な技術・概念(箇条書き)

  1. サードパーティー製アプリケーションのインストール、設定、アンインストール手法
    • MSI/EXEインストーラーのサイレントモード、Transformファイルなど
    • PowerShellスクリプトでの一括導入
  2. PowerShellを用いたアプリケーション管理の自動化
    • Start-Processmsiexec コマンドライン引数の詳細
    • レジストリや設定ファイルを編集するスクリプト化
  3. パッケージ管理ツール(Chocolateyなど)の導入と活用
    • Chocolateyを使ったインストール・アップグレード自動化のメリットと注意点
    • 内部リポジトリ運用とサードパーティライセンス管理
  4. アプリケーションのアンインストールおよび設定変更自動化
    • MSI ProductCodeを使ったアンインストール (msiexec /x)
    • EXEアンインストーラーのスイッチ例、トラブルシューティング
  5. 設定ファイルやレジストリのカスタマイズ自動化
    • XML/INI/JSONなどの編集、PowerShellでの要素置換例
    • アプリケーションログやパラメータをスクリプトで変更
  6. アプリケーション管理ベストプラクティスとセキュリティ
    • ソフトウェア更新の計画とテスト、ロールバック策
    • ライセンスや署名、マルウェアリスクへの配慮

2. サードパーティー製アプリケーションのインストール、設定、アンインストール手法

2-1. MSIとEXEインストーラーの違い

  • MSI(Windows Installer)
    • インストール情報・ロールバック情報を内部に保持
    • msiexec /i "<PathToMSI>" /qn /norestart PROPERTY=VALUE... のような形式でサイレントインストール可能
    • ProductCode(GUID)によりアンインストールや修復を容易に実行
  • EXEインストーラー
    • ベンダー独自のインストーラーロジックが組まれており、オプション(/silent, /quiet, /norestart等)がまちまち
    • /? (ヘルプ) スイッチやドキュメントを確認してサイレントモードを探す必要がある

2-2. PowerShellでのサイレントインストール手法

# MSIインストール例 (サイレント)
Start-Process "msiexec.exe" -ArgumentList "/i C:\Setup\MyApp.msi /qn /norestart LICENSEKEY=ABC123" -Wait -NoNewWindow

# EXEインストール例 (サイレントオプションがベンダー次第)
Start-Process "C:\Setup\myapp_setup.exe" -ArgumentList "/silent /norestart" -Wait -NoNewWindow
  • -Wait オプションでプロセス終了を待機し、終了コードを $LASTEXITCODE で取得できる。
  • -NoNewWindow は同じコンソールで実行するスイッチ。ログ出力をファイルにリダイレクトしたい場合もある。

3. PowerShellを用いたアプリケーション管理の自動化

3-1. 大規模環境での一括導入とCSVファイルの活用

# InstallApps.ps1
param(
    [string]$AppListCsv = "C:\AppList.csv"
)

$appList = Import-Csv $AppListCsv  # Columns: ServerName, InstallerPath, Args
foreach ($app in $appList) {
    Invoke-Command -ComputerName $app.ServerName -ScriptBlock {
        param($path, $args)
        Start-Process $path -ArgumentList $args -Wait -NoNewWindow
    } -ArgumentList $app.InstallerPath, $app.Args
}
  • 上記スクリプトで、複数サーバーに同じアプリケーションをサイレントインストール可能。
  • CSVでInstallerPathや引数を柔軟に管理し、ライセンスキーやカスタム設定を通す例もあり。

3-2. レジストリや設定ファイルの編集

  • アプリが作成したレジストリキーconfigファイルをスクリプトで改変し、環境ごとの差分を吸収。
  • PowerShellによるXML操作例: [xml]$config = Get-Content "C:\App\config.xml" $node = $config.SelectSingleNode("//AppSettings/Setting[@Key='LogLevel']") $node.Value = "DEBUG" $config.Save("C:\App\config.xml")

4. パッケージ管理ツール(Chocolateyなど)の導入と活用

4-1. Chocolateyとは

  • ChocolateyはWindows向けのパッケージ管理システムで、chocoコマンドを用いてインストール、更新、アンインストールを一元化。
  • LinuxのAPTやYumに近い運用が可能で、choco install googlechrome -y だけでChromeのダウンロードとインストールが完結する。
  • 大規模環境でバージョン管理や自動更新を行いやすく、サーバーコアのようなGUIレス環境でも利用可能。

4-2. Chocolateyの基本コマンド

# Chocolateyのインストール(管理者権限で実行)
Set-ExecutionPolicy Bypass -Scope Process -Force
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12
Invoke-Expression ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))

# パッケージ検索
choco search notepad++

# インストール
choco install notepadplusplus -y

# アップグレード
choco upgrade notepadplusplus -y

# アンインストール
choco uninstall notepadplusplus -y

4-3. Chocolatey内製リポジトリとライセンス管理

  • インターネットに接続できない閉域環境や、自由にパッケージを取得できない高セキュリティ環境では、社内リポジトリを用意して運用。
  • ChocolateyのBusiness版やArtifactory、Nexusなどで内部リポジトリを管理し、独自パッケージを登録することでライセンス契約カスタム設定を組み込んだ配布が可能。
  • バージョン固定や更新ペース管理など、パッチ適用を制御できるメリットが大きい。

5. アプリケーションのアンインストールおよび設定変更自動化

5-1. MSIアンインストール(ProductCodeの活用)

# MSIアンインストール
msiexec /x "{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" /qn /norestart
  • ProductCode(GUID)は、レジストリ HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall 下に格納されている。
  • PowerShellで探す例: Get-ChildItem HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall | ForEach-Object { Get-ItemProperty $_.PSPath } | Where-Object { $_.DisplayName -like "*MyApp*" }

5-2. EXEアンインストールとトラブルシューティング

  • EXEアンインストーラーには、/uninstall, /x, /S, /silent など個別オプションが必要な場合がある。
  • 公開されていない場合は/? オプションや製品マニュアルを調査。
  • 例: MyApp_uninstall.exe /silent /norestart
  • トラブル例:
    • レジストリ残骸サービスが残る → 手動スクリプトで後処理が必要な場合あり。
    • インストール先フォルダがアンインストール後も消えない → 追加でRemove-Itemをスクリプト内で実行。

6. 設定ファイルやレジストリのカスタマイズ自動化

6-1. XML/INI/JSONファイル編集の一般的パターン

  • INIファイル: [Section]\nKey=Value 形式で簡易パース。PowerShellには標準サポートがなく、テキスト置換かカスタム関数で扱うことが多い。
  • XMLファイル: [xml]$doc = Get-Content "config.xml" として、.SelectSingleNode().Save() メソッドで操作。
  • JSONファイル: ConvertFrom-Json, ConvertTo-Json を使ってPowerShellオブジェクトとの相互変換。

6-2. アプリケーションログや設定パラメータの動的変更

  • ランタイム中に変更が必要な設定(例: ログディレクトリ、ログレベル)をPowerShellスクリプトで書き換え、アプリケーションを再起動。
  • 大規模運用では、アプリケーションサーバーごとに異なるパラメータを含む変数ファイル(YAML/JSON)を管理し、ForEach-Objectで一括置換する仕組みが効果的。

7. アプリケーション管理ベストプラクティスとセキュリティ

7-1. ソフトウェア更新の計画とテスト、ロールバック策

  • アップグレード時、最新版が動作しない場合に備えてロールバック可能な仕組みが望ましい。
  • マイナーアップデートならin-placeでOKだが、メジャーアップデートでは「旧バージョンをアンインストール → 新バージョンをサイレントインストール」をスクリプト化し、障害が起これば旧バージョンに戻す手順を準備。

7-2. ライセンスや署名、マルウェアリスクへの配慮

  • 不明な出所のEXE/MSIをインストールするのは危険。デジタル署名付きかつベンダーが信頼できるか確認。
  • アンチウイルス製品やSmartscreenなどで事前スキャンし、悪意あるソフト導入を防止。
  • ライセンス契約(商用ソフトウェアの場合)がサーバー数やユーザー数に応じて合法かを監視し、違反しないよう管理ツールと連動するケースもある。

7-3. 監視の自動化と統合管理

  • サードパーティアプリが動かすサービス・プロセスも、第9章で紹介した方法(Get-Service / Get-Process)で監視し、停止時に再起動やアラートを出す。
  • Log4NetやNLogなどのアプリログをログ集約基盤(SIEM, Log Analyticsなど)に送信し、障害予兆やセキュリティ侵害を早期発見。

8. 章末まとめと次章へのつながり

8-1. 学習のまとめ

  • MSI/EXEインストーラーの特性とサイレントインストールのやり方を比較し、PowerShellスクリプトで一括導入設定ファイル修正を実現する手順を確認。
  • パッケージ管理ツール(Chocolateyなど)の導入により、Windows環境でLinuxのAPTやYumのようにソフトウェアを管理するメリットと、内部リポジトリ運用の注意点を把握。
  • アンインストールもmsiexec や EXE固有の引数でサイレント実行可能であるが、ProductCodeの取得や後処理の残骸削除をスクリプト化する必要がある場合も理解。
  • 設定ファイル(XML/INI/JSON)の自動編集や、レジストリ変更によりアプリケーションパラメータを動的に管理できる点が大規模・マルチサーバー運用で強力。
  • ベストプラクティスとして、ライセンス管理やデジタル署名確認、アップデート時のロールバック策など、セキュリティと安定運用に配慮しながら自動化を推進する観点が重要。

8-2. 次章へのつながり

  • 次章(第13章)では、タスクスケジューラの活用方法を詳細に学びます。
  • 本章のインストールスクリプトやアップデートチェックスクリプトをタスクスケジューラで定期的に実行すれば、ソフトウェアの更新を自動化し、適切なタイミングでアップデートを適用可能となります。
  • タスクスケジューラを使ったバックアップやログローテーションも含め、サーバー管理の主要日常タスクを無人化するフローを次章で具体的に習得します。