如何创建无需用户交互即可自行更新的Windows服务

时间:2012-12-11 18:42:55

标签: c# windows install auto-update

我构建了一个安装Windows服务的C#,.NET3.5 Web应用程序(作为NetworkService用户运行)。此服务充当网络上任何计算机的专用Web服务器,用户使用其浏览器连接到服务。

整个事情是使用使用Visual Studio 2008构建的msi文件安装的.msi文件安装并运行部署应用程序,这是处理设置用户和权限,以及安装exe作为服务。

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

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

我有什么方法可以实现这个目标吗?

3 个答案:

答案 0 :(得分:4)

如果您真的不希望在此过程中完全没有用户交互,您是否可以拥有第二个服务,即更新监视程序,并确定何时可以使用新版本的主服务,然后处理下载/停止/安装/开始主要服务?

答案 1 :(得分:1)

以下是我最终解决的问题:

安装服务时,我授予服务用户启动和停止服务的权限。有关详细信息,请参阅my question on service permissions

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

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

答案 2 :(得分:0)

以下是我正在尝试的解决方案:

有一个存根服务,除了检查更新程序,运行更新程序,然后运行主服务程序之外别无其他功能。如果主服务程序以特定的退出代码退出,它将循环并重复(否则它会正常退出)。

主服务程序检查远程URL是否有版本文件,并根据当前程序版本进行检查。如果版本文件不同,它会下载更新zip,从中提取更新程序,并使用特殊退出代码退出。

原始安装程序提供用户帐户,在该帐户下,服务对程序文件夹运行完全权限(因此更新程序可以更新服务程序)。

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