Windowsサービス:InstallUtil.exeコマンドラインによるインストール・アンインストールとよくあるトラブル対処
一、コマンドラインからWindowsサービスをインストール・アンインストールする
1. 使用ツール
Microsoftは.NET Windowsサービスのインストール/アンインストール用に InstallUtil.exe を提供しています。
InstallUtil.exeは.NET Frameworkのバージョンごとに存在します。ツールとプロジェクトの対象フレームワークが不一致だとインストールに失敗します;- 対応するバージョンの
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サービスインストールのよくある問題と解決策
根本的な要因まとめ
インストール失敗は大きく二つの要因に分かれます:
- プロジェクトのコンパイルプラットフォーム、.NETバージョンとInstallUtil.exeのバージョンが不一致;
- 管理者権限がなく、システム側のセキュリティブロックが働く。
例外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バージョンの不整合です。
解決方法
- プロジェクト設定を
x86に変更してビルド; - プロジェクトのフレームワークバージョンに合ったInstallUtil.exeを使用;
例外2:SecurityException セキュリティ権限エラー(頻発)
エラーメッセージ
インストールフェーズで例外が発生しました。
System.Security.SecurityException: ソースが見つかりませんでしたが、イベントログの一部またはすべてを検索できませんでした。アクセスできないログ: Security。
インストールのロールバックフェーズを開始します。
インストールは失敗し、ロールバックが実行されました。Code language: CSS (css)
完全なログファイルパス例:
H:\プロジェクトソース\WindowsServiceDemo\WindowsServiceDemo\bin\Debug\WindowsServiceDemo.InstallLogCode language: CSS (css)
根本原因
コマンドラインまたはVisual Studioが管理者権限で起動されておらず、システムイベントログの読み書きができません。
標準的な対処法
- Visual Studio:右クリック→【管理者として実行】で起動しプロジェクトをリビルド;
- CMD / batスクリプト:右クリック→管理者として実行;
- プロジェクトのビルドプラットフォームを
x86に指定。
インストール成功の目安
コンソール出力:
コミットフェーズは正常に完了しました。
トランザクション処理によるインストールが完了しました。
このあとWindowsサービス一覧(services.msc)を開くと、登録済みのサービスが確認できます。
サービスのインストールとアンインストール