Как мне получить службу 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 с правами администратора.
Другие вопросы предполагают, что я настроил параметры входа в систему для службы, чтобы использовать учетную запись администратора, поэтому я настроил службу для запуска в качестве учетной записи, под которой я в данный момент вошел, кто смог открыть командную строку с повышенными правами и / или запустите установщик вручную, но это ничего не изменит.
Есть ли способ сделать то, что я пытаюсь сделать?
В настоящее время я не привержен какой-либо конкретной стратегии автоматического обновления, но я знаю, что хочу, чтобы этот сервис обновлялся сам. Так что, если я делаю что-то не так, я на 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" не распознается как имя командлета, функции, файла сценария или работоспособной программы.
1 ответ
Похоже, призыв к msiexec
на самом деле не нацеливается c:\windows\system32\msiexec.exe
В соответствии с этим вопросом кажется, что Powershell не использует стандартную переменную среды PATH, но имеет свою собственную схему, которая, возможно, не работает должным образом в контексте системной службы.
Самое простое решение, как вы говорите, это указать полный путь, который, вероятно, c:\windows\system32\msiexec.exe
,
Однако в производственной среде, вероятно, было бы разумно избегать использования жестко заданного пути, поскольку у вас могут возникнуть проблемы с локализацией, изменениями операционной системы и так далее. Возможно, вы могли бы использовать SearchPath или эквивалент.NET из вашей службы и либо написать сценарий Powershell в режиме реального времени, либо передать путь к msiexec
в качестве параметра командной строки, или может быть разумное решение Powershell.