Windows服务 使用InstallUtil.exe命令行安装卸载 和 常见故障解决
一、使用命令行安装、卸载Windows服务
1. 工具
微软提供 InstallUtil.exe 用于 .NET Windows服务的安装与卸载。
InstallUtil.exe区分.NET Framework版本,工具版本和项目目标框架不匹配,会直接安装失败;- 需要将对应版本的
InstallUtil.exe复制到服务程序Debug输出目录(与服务exe同级)。
InstallUtil工具是属于.NET SDK的一部分的,你安装不同的版本,就会有不同的InstallUtil。
.NET Framework 4.0 / 4.5 / 4.6 / 4.7 / 4.8(最常用)32位和64位也是不一样的。
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe 例如这是64位。
.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" 或它的某一个依赖项。试图加载格式不正确的程序。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:右键【以管理员身份运行VS】,打开项目重新编译;
- CMD / bat脚本:右键 → 以管理员身份启动;
- 项目编译平台选择
x86生成。
安装成功标识
控制台输出:
“提交”阶段已成功完成。
已完成事务处理安装。
此时打开 Windows服务列表(services.msc),即可看到注册好的服务。
Previous: 第一个 Windows Service