我们在 VisualStudio 2008 中创建了一个轻量级(VC++,没有 .Net)Windows 服务,包括一个 Visual Studio 安装项目。
安装项目有三个自定义操作,sc.exe 的简单调用(在“提交”部分创建和启动,在“卸载”部分删除)。这在几台不同的 Win7 机器上运行良好,但在 XP 机器上失败(在 Virtual PC“Windows XP 模式”上也失败),msiexec 详细日志显示错误 1721:“此 Windows 安装程序包有问题。一个程序无法运行完成此安装所需的操作。请联系您的支持人员或软件包供应商。”
删除自定义操作时,安装在 WinXP 机器上没有问题地完成。安装完成后通过从命令行调用 sc.exe 创建和启动服务(由具有相同权限的同一用户完成)也可以。
Orca 将自定义操作的类型显示为“提交”部分中的操作的 3586 和“卸载”部分中的操作的 3074。
研究:
一些堆栈溢出的答案和其他站点表明原因是缺少权限(另外,在 Win7 上安装时,会出现 UAC 对话框)并建议使用“Runas”,但该服务将安装在我们不知道的机器上哪些用户具有哪些权限以及如何在本地系统帐户下运行 CMD.exe?建议使用系统帐户可能无法在简单的自定义操作中实现。
大多数其他问题/答案都与 WiX 有关,这会增加开销,我们希望在如此小的项目中避免这种情况。
安装程序和生成的服务应具有尽可能少的先决条件,并且安装应该只需要执行 .msi 文件。
还是我们被误导了,有更好的方法让安装程序在安装时创建并启动服务?