.NET - 如果服务以LocalSystem(而不是Administrator)运行,则Windows Service启动的进程会过早被杀死

时间:2015-11-19 10:23:00

标签: .net process msiexec

这让我在过去两天疯狂。我正在尝试为我们的Windows服务做一个非常简单的更新程序。这个想法如下:

  • 服务知道它必须自行更新;它使用Process.Start
  • 启动更新程序
  • 更新程序下载新的.msi,卸载当前应用程序并安装新应用程序

值得注意的是:安装程序是应用程序的一部分,因此它也会在此过程中被删除/重新安装。

问题:在卸载应用程序后,updater进程会立即停止。

首先,我认为如果exe被删除或者其调用者(windows服务)被杀死,更新器将被终止是有意义的。但是:如果服务以管理员而不是LocalSystem运行,那么一切都运行良好!为什么?我无法解决这个问题。

启动更新程序的Windows服务中的代码:

Dim tProcess As New Process
tProcess.StartInfo.FileName = "ServiceUpdater.exe"
tProcess.StartInfo.WorkingDirectory = AppDomain.CurrentDomain.BaseDirectory
tProcess.Start()

在ServiceUpdater.exe中,卸载并重新安装服务的代码:

LogWindowsEvent("Now uninstalling.", Nothing, EventLogEntryType.Information)
Uninstall()
LogWindowsEvent("Uninstalled. Now installing.", Nothing, EventLogEntryType.Information)
Install()
LogWindowsEvent("Installed.", Nothing, EventLogEntryType.Information)
  • 当服务(以及更新程序?)作为LocalSystem运行时,"卸载"永远不会打印日志
  • 当服务(以及更新程序?)以管理员身份运行时,将打印所有日志

如果重要,请卸载功能:

Private Sub Uninstall()
    Process.Start("msiexec.exe", "/x{" & "7E59BCD2-0DDC-4653-9AFF-15126A5C811E" & "} /quiet").WaitForExit()
End Sub

这里发生了什么?

谢谢!

2 个答案:

答案 0 :(得分:0)

问题可能与删除特定服务/文件夹中的文件所需的ADMIN RIGHTS有关。

尼古拉斯,我想如果你改变更新的逻辑,你的问题应该以任何方式解决。

更新不得卸载服务,但要将其停止并将其替换为新模块。

为此,您必须调用另一个应用程序,它将提供以下操作:停止服务,将新模块复制到其上,重新启动服务。

答案 1 :(得分:0)

我通过将应用程序文件复制到临时文件夹并从该文件夹运行ServiceUpdater来使其工作。显然,更新程序在exe文件被删除时(由LocalSystem运行时)停止,所以这让它运行完成。然后我清除临时文件夹。

这并不能解释为什么更新程序在由LocalSystem运行而不是由管理员运行时删除exe时停止 - 但它现在对我来说已经足够好了。