3

我正在开发一个将作为 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 脚本。

其他问题建议我将服务的登录设置设置为使用管理员帐户,因此我将服务设置为以我当前登录的帐户运行,该帐户能够打开提升的命令提示符和/或手动运行安装程序,但这样做并没有改变任何东西。


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

我目前没有承诺任何特定的自动更新策略,但我知道我希望这项服务能够自行更新。因此,如果我做的事情完全错误,我会 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、函数、脚本文件或可运行程序的名称。

4

1 回答 1

1

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

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

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

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

于 2016-03-14T22:37:29.130 回答