Запуск 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.