【发布时间】: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: programName和SERVICE_SID_TYPE: NONE -
我认为最好缩小问题范围。尝试 Process Monitor(可从 MS 网站免费获得)以查看 Powershell 进程是否正在启动、msiexec 进程是否正在启动、Powershell 进程是否过早死亡等。
标签: c# windows-services automatic-updates