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

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

4

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

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

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

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

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

此外,如果找到关于如何在不使用安装项目的情况下安装 Windows 服务的精彩答案。

于 2013-04-04T23:24:18.917 回答