Мы работаем над системой обновления для нашего программного обеспечения. updater должен работать в фоновом режиме как услуга, и когда обновление доступно, загрузите и установите его. Нам нужен сервис для установки обновления, так как MSI требует, чтобы повышение работало, но некоторые наши клиенты будут ограниченными пользователями.
MSI является WiX MSI и делает значительное обновление, когда выполнено. Проблема, обновление, кажется, не работает, когда выполнено от нашего сервиса. Я вижу msiexec, выполненный, и он возвращается успешно, но это, кажется, не вносит изменений в систему. Та же команда, когда выполнено от моей учетной записи пользователя работает как ожидалось.
Там некоторый протест к выполнению msiexec от Локальной Системной службы?
Мы просто делаем:
string arguments = "/i /quiet /lv*x " + pathToLogFile;
System.Diagnostics.Process.Start("msiexec.exe", arguments);
Если ваша служба является службой Windows, выполните следующие действия:
Откройте свойства вашей службы в консоли служб.
Перейдите на вкладку Вход в систему
Установите учетную запись с правами на обновление системы (вашу или специально созданную для этой цели)
Перезапустите службу
В этом случае, служба будет запускаться с соответствующими правами и может выполнять обновления.
У меня была такая же задача, описанная выше, и я обнаружил, что если программа установлена для ВСЕХ пользователей, то запуск msiexec будет работать из службы, запущенной под учетной записью SYSTEM. Поэтому, чтобы это сработало, вам придется установить программу для ВСЕХ пользователей. В моем случае при первой установке программы я указал команду msxexec следующим образом.
msiexec /i setup.msi ALLUSERS="1"
Как только это будет сделано, вы сможете просто обновить программу из Service без каких-либо проблем.
Возможно, вам потребуется использовать параметр REINSTALLMODE
, который позволяет управлять обновлением. Если они не предоставлены, установка может автоматически не обновить ваше приложение (или, по крайней мере, то, что я обнаружил, хотя я все еще не уверен, применяется ли то же поведение к System.Diagnostics.Process.Start):
msiexec.exe /i /quiet yourinstaller.msi REINSTALL=All REINSTALLMODE=vomus
См. здесь для получения дополнительной информации о различных флагах, которые можно передать в msiexec.exe
.