【问题标题】:How can I create a Windows Service which updates itself without user interaction如何创建无需用户交互即可自行更新的 Windows 服务
【发布时间】:2012-12-11 18:42:54
【问题描述】:

我已经构建了一个 C#、.NET3.5、Web 应用程序,它安装了一个 Windows 服务(以 NetworkService 用户身份运行)。该服务充当网络上任何机器的专用 Web 服务器,用户使用浏览器连接到该服务。

使用 Visual Studio 2008 构建的 msi 文件安装整个程序。msi 文件安装并运行部署应用程序,该应用程序用于设置用户和权限,以及将 exe 安装为服务。

如果我决定增强应用程序(或查找并修复错误),我可以生成一个新的 msi 文件,并让用户在运行我的应用程序的所有机器上运行它。但我宁愿这自动发生(包括从我的网站下载更新并进行部署)。

因为它作为服务运行,它不是特定于用户的,所以我理解 Click Once 部署不是一个选项。

我有什么办法可以做到这一点吗?

【问题讨论】:

    标签: c# windows installation auto-update


    【解决方案1】:

    如果您真的不希望在此过程中进行任何用户交互,您是否可以拥有第二个服务,即更新看门狗,并识别主要服务的新版本何时可用,然后处理下载/停止/安装/主服务启动?

    【讨论】:

    • 是的,我已经想到了。第二个服务可能必须以机器管理员身份运行,因此它可以覆盖必要的文件(并停止和重新启动服务)。大概是说安装的时候要问管理员密码吧?
    • 嗯,实际上,您已经在请求管理权限,因为您希望能够首先重新安装该服务。我相信无论您如何完成此任务,身份验证都是可行的。
    • 我已经接受了这个作为答案,即使我不喜欢它。大概我必须在安装时向用户询问管理员密码,才能创建管理员服务?
    【解决方案2】:

    这是我最终得到的解决方案:

    在安装服务时,我授予服务用户启动和停止服务的权限。详情请见my question on service permissions

    服务程序检查版本文件的远程 url,并根据当前程序版本检查它。如果版本文件不同,它会下载更新 zip,从中提取更新程序,锁定文件,运行更新程序并立即退出。

    更新程序锁定同一个文件,等待几秒钟(只是为了确保服务已停止),解压缩 zip(不包括更新程序本身),最后重新启动服务。

    【讨论】:

      【解决方案3】:

      这是我现在正在尝试的解决方案:

      有一个存根服务,它只是检查更新程序,运行更新程序,然后运行主服务程序。如果主服务程序以特定的退出代码退出,它会循环并重复(否则正常退出)。

      主服务程序检查远程 url 中的版本文件,并根据当前程序版本检查它。如果版本文件不同,它会下载一个更新 zip,从中提取更新程序,并以特殊的退出代码退出。

      原始安装程序授予运行服务的用户帐户对程序文件夹的完全权限(因此更新程序可以更新服务程序)。

      唯一的缺点是无法更新存根服务。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-04
        • 2016-10-17
        • 2021-06-05
        • 2015-02-01
        相关资源
        最近更新 更多