C# 如何让windows服务自我更新

C# 如何让windows服务自我更新,c#,windows-services,automatic-updates,C#,Windows Services,Automatic Updates,我正在开发一个将作为windows服务运行的应用程序,并试图让它自动更新 我目前的方法是执行powershell脚本,该脚本将停止服务,运行msi安装程序,然后重新启动服务 这就是powershell脚本此时的样子 Start-Sleep -s 10 Write-Host "update start" Stop-Service ServiceName1 msiexec /i c:\ProgramData\ProgramName\Install\ServiceName.Setup.msi /pa

我正在开发一个将作为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%愿意尝试不同的方法


更新:

我做了以下更改来记录MSIEXEC的错误和输出

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、函数、脚本文件或可操作程序的名称


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

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

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


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

@stuartd如果我能通过快速谷歌搜索找到解决此问题的方法,我一开始不会在这里问任何问题。@stuartd所以我已经以内置的。\r管理员帐户启动了windows服务,并且没有任何更改。该服务是否配置了受限制的权限?(如果您不确定,可以使用
sc qsidtype
来确定。)@HarryJohnston很抱歉耽搁了您几天,我不得不专注于另一个项目
sc-qsidtype-programName
,给了我
SERVICE\u-NAME:programName
SERVICE\u-SID\u-TYPE:NONE
我想最好把问题缩小一点。请尝试Process Monitor(从MS网站免费提供),查看Powershell进程是否正在启动,msiexec进程是否正在启动,Powershell进程是否过早死亡,等等。