【问题标题】:How do I get a windows service to update itself如何让 Windows 服务自行更新
【发布时间】:2016-03-08 16:46:12
【问题描述】:

我正在开发一个将作为 Windows 服务运行的应用程序,我正在尝试让它自动更新。


我目前的方法是执行 powershell 脚本,该脚本将停止服务,运行 msi 安装程序,然后重新启动服务。

这是powershell脚本此时的样子

Start-Sleep -s 10
Write-Host "update start"
Stop-Service ServiceName1
msiexec /i c:\ProgramData\ProgramName\Install\ServiceName.Setup.msi /passive /l*v C:\ProgramData\ProgramName\Install\log.txt | Out-Null
Start-Service ServiceName1
Write-Host "update finished"

这就是我从应用程序运行它的方式

Process.Start("Powershell", @"C:\ProgramData\ProgramName\Install\UpdateApp.ps1");

发生的情况是服务停止并重新启动,但它没有更新。就好像 msi 永远不会运行。日志文件甚至没有出现。

当我从提升的命令提示符将服务作为命令行应用程序运行时,它按预期工作并且应用程序得到更新,所以我目前的理论是该服务没有以管理员权限运行 powershell 脚本。

Other questions suggest that I set up the log on settings for the service to use an administrator account,因此我将服务设置为以我当前登录的帐户运行,该帐户能够打开提升的命令提示符和/或手动运行安装程序,但这样做并没有改变任何东西.


有什么办法可以做我想做的事吗?

我目前没有承诺任何特定的自动更新策略,但我知道我希望这项服务能够自行更新。因此,如果我做错了事,我会 100% 乐于尝试不同的方法。


更新:

我进行了以下更改以记录 msiexecc 的错误和输出

Try{
    c:\windows\system32\msiexec.exe /i c:\ProgramData\ProgramName\Install\ServiceName.msi /passive /l*v C:\ProgramData\ProgramName\Install\log.txt | Out-File -filepath C:\ProgramData\ProgramName\Install\output.txt
}
Catch {
    $_ | Out-File C:\ProgramData\ProgramName\Install\errors.txt -Append
}

运行该脚本后,我发现以下错误:

术语“msiexec”未被识别为 cmdlet、函数、脚本文件或可运行程序的名称..

【问题讨论】:

  • @stuartd 如果我可以通过快速的 google 搜索找到解决此问题的方法,我一开始就不会在这里提问。
  • @stuartd 所以我已经将windows服务作为内置的.\Administrator账户启动了,没有任何变化
  • 服务是否配置了受限权限? (如果不确定,可以使用sc qsidtype查询。)
  • @HarryJohnston 抱歉耽搁了几天,我不得不专注于一个不同的项目几天。 sc qsidtype programName,给我SERVICE_NAME: programNameSERVICE_SID_TYPE: NONE
  • 我认为最好缩小问题范围。尝试 Process Monitor(可从 MS 网站免费获得)以查看 Powershell 进程是否正在启动、msiexec 进程是否正在启动、Powershell 进程是否过早死亡等。

标签: c# windows-services automatic-updates


【解决方案1】:

看起来对msiexec 的调用实际上并不是针对c:\windows\system32\msiexec.exe

根据this question,Powershell 似乎不使用标准的 PATH 环境变量,但有自己的方案,在系统服务的上下文中可能无法按预期工作。

如您所说,最简单的解决方案是指定完整路径,可能是c:\windows\system32\msiexec.exe

但是,在生产环境中,避免使用硬编码路径可能是明智之举,因为您可能会遇到本地化、操作系统更改等问题。您也许可以使用SearchPath 或服务中的 .NET 等效项,并实时写出 Powershell 脚本或将路径传递给 msiexec 作为命令行选项,或者可能有一个明智的 Powershell 解决方案。

【讨论】:

    猜你喜欢
    • 2020-09-05
    • 2023-03-15
    • 2010-11-08
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    • 2017-11-17
    • 1970-01-01
    • 2015-11-28
    相关资源
    最近更新 更多