2016-03-08 37 views
3

我正在研究一個將作爲Windows服務運行的應用程序,我試圖讓它自動更新自己。我如何得到一個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,所以我將服務設置爲我當前登錄的帳戶運行,誰能夠打開提升的命令提示符和/或手動運行安裝程序,但這樣做並沒有改變任何內容。


有沒有辦法做我想做的事情?

我目前沒有犯下任何特定的自動更新策略,但我知道,我想這項服務進行自我更新。所以如果我在做一些完全錯誤的事情,我可以嘗試一種不同的方法。


UPDATE:

我做了如下修改日誌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 
} 

錯誤和輸出運行腳本後,我發現了以下錯誤:

The term 'msiexec' is not recognized as the name of a cmdlet, function, script file, or operable program..

+0

@stuartd如果我能通過快速的谷歌搜索找到解決這個問題的解決方案,那麼首先我不會在這裏問一個問題。 –

+0

@stuartd所以我開始使用windows服務作爲內置的\ Administrator帳戶,並且一直沒有變化 –

+0

該服務是否配置了限制特權? (你可以使用'sc qsidtype'來確定你是否確定) –

回答

1

看起來像撥打msiexec實際上不是針對c:\windows\system32\msiexec.exe

按照this question似乎PowerShell不使用標準的PATH環境變量,但有自己的計劃,這或許有望在系統服務的情況下無法正常工作。

最簡單的解決,就像你說的,是指定的完整路徑,這可能是c:\windows\system32\msiexec.exe

然而,在生產中,它可能是明智的,避免使用硬編碼的路徑,因爲你可能本地化,操作系統的更改遇到問題,等等。你也許可以使用SearchPath或者你的服務中的.NET等價物,或者實時寫出Powershell腳本,或者將路徑作爲命令行選項傳遞給msiexec,或者可能有一個明智的Powershell解決方案。

相關問題