我正在开发一个将作为 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、函数、脚本文件或可运行程序的名称。