.NET - 由 Windows 启动的进程如果服务以 LocalSystem(而不是管理员)身份运行,服务将被过早终止

.NET - Process started by Windows Service is killed prematurely if the service runs as LocalSystem (as opposed to Administrator)

这两天让我发疯了。我正在尝试为我们的 Windows 服务做一个非常简单的更新程序。思路如下:

值得注意:安装程序是应用程序的一部分,因此它也是 removed/reinstalled 过程的一部分。

问题:应用程序卸载后更新进程立即停止。

起初我认为如果 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)

万一重要,卸载功能:

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

这是怎么回事?

谢谢!

问题可能与删除特定 service/folder 文件所需的管理员权限有关。

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

更新不能卸载该服务,而是停止它并用新模块替换它。

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

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

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