如何更新正在运行的服务?

时间:2009-09-15 14:04:43

标签: c#

目前我有一个用于更新我的软件的应用程序,这是一个独立的可执行文件,唯一的工作就是执行软件更新。

启动时,它会将自身从\ Binary \复制到\ Running \文件夹,然后在\ Running \中自行执行以执行工作(因此\ Binary \中的副本永远不会被锁定或正在使用中),如果需要更新自己,只需更新\ Binary \下的副本,以便下次运行时执行较新的副本并且没有问题。这个过程多年来一直很好......

现在我需要进行更改,我需要将此流程移至SERVICE(因此它可以作为具有管理员权限的LocalSystem执行软件更新) - 我可以使用相同的模型吗?服务启动时是否可以将自身从\ Binary \复制到\ Running \并始终从\ Running \文件夹运行?

否则,有关如何更新Service.exe的任何建议?

任何建议,帮助和建议都将不胜感激。 谢谢,

2 个答案:

答案 0 :(得分:1)

在过去的项目中,我们使用了两阶段更新:

  • 首先,一个非常小的简单程序Stub将检查实际更新程序的更新(称为CopyFiles)。如果CopyFiles在服务器上较新,则会被复制下来。

  • 然后,Stub将启动CopyFiles并自行终止。

  • 如果需要,CopyFiles可以更新Stub以及所有主要的应用程序文件。

  • 然后,CopyFiles将启动主应用程序可执行文件。

对于您的场景,我可以预见两个服务正在运行 - 一个是您的实际应用程序,另一个是监视您的\ Binary文件夹。该服务具有管理员权限,可以关闭实际的应用程序服务,将更新复制到\ Running,然后再次启动应用程序服务。

答案 1 :(得分:0)

如果您创建一个调用现有应用的单独Windows服务,该怎么办?只要您的应用程序没有GUI并且不假设它在用户帐户下运行(例如,不访问HKCU注册表项),那么这应该有效。在Windows下,子进程继承父进程的安全上下文,因此从服务调用的独立exe应该在配置的服务帐户下运行。