自动执行Windows服务部署的最佳方法是什么?

25 c# msbuild build-automation windows-services

我在Visual Studio 2010中使用C#创建了一个Windows服务.我做了很多关于自动化安装过程的研究.有很多建议,但没有一个对我有用.我创建的Windows服务有很多依赖项,我希望客户端在安装过程中没有UI交互.我为此创建了一个安装项目,其中包含安装程序中的所有依赖项.

涉及的过程:

  • 为Windows服务创建一个构建
  • 将安装文件(.msi)推送到远程位置
  • 调用.msi并静默安装服务,无需用户交互.

到目前为止我做了什么:

  • 创建了一个powershell脚本,用于将文件推送到远程位置
  • 执行powershell脚本并安装该服务

请记住powershell脚本

sc create "servicename" binpath="somepath"
Run Code Online (Sandbox Code Playgroud)

用于从项目目录安装服务而不是用于安装使用Setup Project创建的.msi文件这些是两个截然不同的东西.如果你不明白,请不要回答.

可能的解决方案:

现在我的问题是.如何将Windows服务安装程序推送到远程位置?如何创建自定义构建参数并使用msbuild扩展包或Exec Task并安装该服务?

我知道对于没有使用安装项目创建的(.MSI)安装服务的人来说,这听起来很愚蠢和恼人.但是我的要求是我试图在企业环境中解决几个星期.

Zac*_*tes 18

我会从powershell脚本中完成大部分工作.

  1. 使用您提到的msbuild Exec任务将其添加到构建过程中.这是一篇关于使用exec任务来运行powershell脚本的相当不错的文章.

  2. 由于您使用的是VS 2010,因此设置和部署项目非常简单.在解决方案中添加一个,并将服务项目的输出添加到其中.这是一篇关于为Windows服务添加安装项目的文章.

  3. 使用powershell脚本将安装程序.msi复制到远程服务器.copy-item [source] [destination]如果您有权访问文件共享,则可以使用.

  4. 停止远程计算机上的服务.你可以使用(get-service -ComputerName [destination] -Name [service-name]).Stop()(从这个问题)

  5. 使用psexec 以静默方式安装服务psexec \\remotecomputer "[msi-destination-path]" /qn 以下是.msi的其余命令行选项.

  6. 使用启动服务 (get-service -ComputerName [destination] -Name [service-name]).Start()

我还会为目标服务器,服务名称等的powershell脚本添加一堆参数.这将使维护构建过程的这一部分变得更加容易.您的构建代理也很可能必须是目标计算机上的管理员.

最后,确保将您的powershell构建脚本放在源代码管理中!

编辑(2014年6月)
VS 2013再次安装了安装程序项目!(抱歉,VS 2012)

此外,如果找到关于如何在不使用安装项目的情况下安装Windows服务的这个很棒的答案.