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