自动化Windows服务部署的最佳方式是什么?

25

我使用Visual Studio 2010和C#创建了一个Windows服务。我进行了很多关于自动化安装过程的研究。得到了很多建议,但都没有为我解决问题。我创建的Windows服务有很多依赖项,我希望在安装过程中客户端不需要任何UI交互。我为此创建了一个设置项目,并将所有依赖项都包含在安装程序中。

涉及的步骤:

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

我目前所做的:

  • 创建了一个PowerShell脚本来将文件推送到远程位置
  • 执行PowerShell脚本并安装服务

请注意,PowerShell脚本

sc create "servicename" binpath="somepath"

该命令用于从项目目录安装服务,而不是安装使用Setup Project创建的.msi文件,这是两种非常不同的事情。如果您不理解这一点,请不要回答。

可能的解决方案:

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

我知道对于那些没有使用由Setup Project创建的.msi文件安装服务的人来说,这听起来很愚蠢和恼人。但这是我在企业环境中试图解决多周的需求。


你在自动化Windows服务部署方面取得成功了吗? - bhupinder
1个回答

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的其余命令行选项。

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

  • 我还会为目标服务器、服务名称等添加一些参数到powershell脚本中。这样做将使您的构建过程更加容易维护。同时,您的构建代理人很可能也必须是目标机器上的管理员。

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

    编辑(2014年6月)
    VS 2013又有了安装程序项目! (对不起,VS 2012)

    此外,如果找到这篇关于如何在没有使用安装程序项目的情况下安装Windows服务的绝妙答案


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接