【问题标题】:What is the best way of automating Windows Service deployment?自动化 Windows 服务部署的最佳方式是什么?
【发布时间】:2013-03-27 05:33:32
【问题描述】:

我在 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 并安装服务?

我知道对于尚未使用由安装项目创建的 (.MSI) 安装服务的人来说,这听起来既愚蠢又令人恼火。但这是我在企业环境中数周以来一直在努力解决的要求。

【问题讨论】:

  • 您在自动化 Windows 服务部署方面取得了成功吗?

标签: c# msbuild windows-services build-automation


【解决方案1】:

我会通过 powershell 脚本完成大部分工作。

  1. 使用您提到的 msbuild Exec 任务将其添加到您的构建过程中。这是using the exec task to run your powershell script上的一篇不错的文章。

  2. 由于您使用的是 VS 2010,setup and deployment project 非常简单。将一个添加到您的解决方案中,并将您的服务项目的输出添加到其中。这是adding the setup project for a windows service上的一篇文章。

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

  4. 停止远程计算机上的服务。你可以使用(get-service -ComputerName [destination] -Name [service-name]).Stop()(来自this question)

  5. 使用psexecpsexec \\remotecomputer "[msi-destination-path]" /qnHere's the rest of the command line options for the .msi.静默安装服务

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

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

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

编辑(2014 年 6 月)
VS 2013 has installer projects again!(抱歉,VS 2012)

另外,如果找到this awesome answer,关于如何在不使用安装项目的情况下安装 Windows 服务。

【讨论】:

    猜你喜欢
    • 2012-03-01
    • 1970-01-01
    • 2011-11-20
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 2019-01-03
    • 2016-01-04
    • 2010-09-06
    相关资源
    最近更新 更多