サービスのインストールとアンインストール

Windowsサービス:InstallUtil.exeコマンドラインによるインストール・アンインストールとよくあるトラブル対処

一、コマンドラインからWindowsサービスをインストール・アンインストールする

1. 使用ツール

Microsoftは.NET Windowsサービスのインストール/アンインストール用に InstallUtil.exe を提供しています。

  1. InstallUtil.exeは.NET Frameworkのバージョンごとに存在します。ツールとプロジェクトの対象フレームワークが不一致だとインストールに失敗します;
  2. 対応するバージョンの InstallUtil.exe をサービスプログラムの Debug出力フォルダ(サービスEXEと同じ階層)へコピーしてください。

InstallUtilは.NET SDKに同梱されており、インストールするSDKバージョンによって中身が変わります。

.NET Framework 4.0 / 4.5 / 4.6 / 4.7 / 4.8(最もよく使われる)には32bit版と64bit版がそれぞれ存在します。

64bitの例:C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe

.NET 5 /.NET 6 /.NET 7 /.NET 8 /.NET 9(.NET Core系)にはInstallUtil.exeは付属しません

2. ファイル構成(Debugフォルダ)
WindowsServiceDemo.exe       // Windowsサービス本体
WindowsServiceDemo.pdb
InstallUtil.exe             // コピーしたインストールツール
install.bat                 // インストール用スクリプト
uninstall.bat               // アンインストール用スクリプト
log.txtCode language: JavaScript (javascript)
3. バッチスクリプトの作成

install.bat 【サービスインストール】

d:
cd D:\WindowsService3\WindowsService3\bin\Debug
InstallUtil WindowsServicePicture.exe
pauseCode language: CSS (css)

uninstall.bat 【サービスアンインストール】

d:
cd D:\WindowsService3\WindowsService3\bin\Debug
InstallUtil /u WindowsServicePicture.exe
pause

パラメータ解説:/u = uninstall、サービス削除を意味します

右クリックして管理者としてCMDを実行、またはbatファイルを管理者実行する必要があります。権限が不足するとセキュリティ例外が発生し、インストールが失敗し自動的にロールバックされます。

二、Windowsサービスインストールのよくある問題と解決策

根本的な要因まとめ

インストール失敗は大きく二つの要因に分かれます:

  1. プロジェクトのコンパイルプラットフォーム、.NETバージョンとInstallUtil.exeのバージョンが不一致;
  2. 管理者権限がなく、システム側のセキュリティブロックが働く。
例外1:BadImageFormatException

エラーメッセージ

System.BadImageFormatException: ファイルまたはアセンブリ"WindowsServiceDemo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"、またはその依存関係の1つを読み込めません。正しくない形式のプログラムを読み込もうとしました。Code language: JavaScript (javascript)

原因
プロジェクトのコンパイル対象プラットフォーム(x86/x64/AnyCPU)とInstallUtil.exeのビット数が不一致、または.NETバージョンの不整合です。
解決方法

  1. プロジェクト設定を x86 に変更してビルド;
  2. プロジェクトのフレームワークバージョンに合ったInstallUtil.exeを使用;
例外2:SecurityException セキュリティ権限エラー(頻発)

エラーメッセージ

インストールフェーズで例外が発生しました。
System.Security.SecurityException: ソースが見つかりませんでしたが、イベントログの一部またはすべてを検索できませんでした。アクセスできないログ: Security。

インストールのロールバックフェーズを開始します。
インストールは失敗し、ロールバックが実行されました。Code language: CSS (css)

完全なログファイルパス例:

H:\プロジェクトソース\WindowsServiceDemo\WindowsServiceDemo\bin\Debug\WindowsServiceDemo.InstallLogCode language: CSS (css)

根本原因
コマンドラインまたはVisual Studioが管理者権限で起動されておらず、システムイベントログの読み書きができません。

標準的な対処法

  1. Visual Studio:右クリック→【管理者として実行】で起動しプロジェクトをリビルド;
  2. CMD / batスクリプト:右クリック→管理者として実行
  3. プロジェクトのビルドプラットフォームを x86 に指定。
インストール成功の目安

コンソール出力:

コミットフェーズは正常に完了しました。
トランザクション処理によるインストールが完了しました。

このあとWindowsサービス一覧(services.msc)を開くと、登録済みのサービスが確認できます。

サービスのインストールとアンインストール

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です