Показаны сообщения с ярлыком msi. Показать все сообщения
Показаны сообщения с ярлыком msi. Показать все сообщения

понедельник, 17 февраля 2020 г.

InstallShield - ошибка 1720

При разворачивании msi-пакета на очередной машине под управлением Windows 7 обнаружилась проблема: в самом начале установки пакет выдаёт ошибку "1720 Ошибка пакета установщика Windows. Сценарий, требующуюся для завершения установки не может быть выполнен. Обратитесь к системному инженеру или к поставщику пакета", и установка прекращается.

Попробовал запустить установку с журналированием. Делается это, напомню, командой:
msiexec /i пакет.msi /L*V журнал.log

В файле журнал.log в результате оказывается много всего, но сориентироваться, с какого момента всё пошло не так, можно. В моём случае это оказалась некая CustomAction. Имя этой CustomAction из журнала выудить можно, а что именно она делает - загадка.

Однако, оказалось, всё не так плохо. Есть специальный просмотрщик/редактор инсталляционных пакетов, Orca.exe, входящий в состав Windows SDK, который позволяет посмотреть эти самые CustomAction-ы.

В моём случае это оказалась проверка на наличие .NET 4. Проверка представляет собой VB-скрипт, который, будучи вытащен в отдельный vbs-файл, запускается без проблем, а вот в русле инсталляции работать отказывается. Скрипт этот выглядит так:
NetFrameworkTargetVersion = GetRegistryKey("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full\TargetVersion", "0.0.0")
if NetFrameworkTargetVersion = "0.0.0" or NetFrameworkTargetVersion <> "4.0.0" then
  NetFrameworkUrl = "http://www.microsoft.com/ru-ru/download/details.aspx?id=17718"  
  InfoMsg = "Для корректной работы требуется Microsoft .Net Framework 4 или более старшая версия"
  InfoMsg = InfoMsg + "Ссылка для скачивания представлена ниже"
  InputBox InfoMsg, "Программа - Установка", NetFrameworkUrl
  Err.Clear
  Err.Raise 100
end if

function GetRegistryKey(RegistryKey, DefaultValue)
  Dim WSHShell, value
  On Error Resume Next
  Set WSHShell = CreateObject("WScript.Shell")
  Value = WSHShell.RegRead(RegistryKey)
  if Err.number <> 0 then
    GetRegistryKey = DefaultValue
  else
    GetRegistryKey = Value
  end if
  Set WSHShell = Nothing
end function
Почему он так себя ведёт, так и осталось загадкой. В сети, правда, есть слухи, что из соображений безопасности вызов WScript.Shell не приветствуется в CustomAction-ах.

Однако, пакет-то развернуть надо. Пришлось в инталляционном пакете при помощи всё той же Orca.exe удалить все CustomAction-ы, содержащие проверки такого рода, и тогда инсталляция прошла нормально.

P.S. Там правда, есть ещё одна тонкость. Если программа была установлена раньше, а теперь не даёт себя изменить/удалить из-за вышеописанной проблемы, то патч msi-пакета ничего не даст: дело в том, что копия установочного пакета сохранена в папке C:\Windows\Installer (имя копии можно узнать из вышеупомянутого файла журнал.log). Поэтому при запуске пакета будет запущена его сохраненная копия. Если же перед запуском прибить эту самую копию, тогда пропатченный пакет отработает нормально.

воскресенье, 8 мая 2016 г.

msiexec: журналирование

Оказывается, при инсталляции пакета .msi можно включить журналирование. Делается это так:
msiexec /i пакет.msi /L*V имя_файла_журнала.log

понедельник, 17 февраля 2014 г.

Windows: Создаём MSI

Возникла тут небольшая задачка.

Есть некая программа. Разработчик этой программы периодически присылает её обновления. Эти обновления имеют хитрое расширение AAA.upg и устанавливаются с помощью специальной утилиты UUU.exe

Компьютеры, на которых используется эта программа, имеют пару особенностей. Во-первых, их много. Во-вторых, они участвуют в домене, где из соображений безопасности пользователям какие попало и откуда попало екзешники выполнять нельзя.

Получается, что остаётся два варианта установки обновлений. Первый: на каждом компьютере установить утилиту UUU.exe и настроить с ней ассоциацию файлов *.upg. Затем рассылать, скажем, по почте очередные обновления, и пусть пользователи их запускают двойным кликом. Этот способ имеет свои недостатки. Например, попытка этой утилиты с пользовательскими правами что-нибудь записать в системные каталоги будет заведомо неудачной.

Второй вариант, по-моему, гораздо более предпочтительный - воспользоваться публикацией пакетов обновлений. Однако, тут тоже есть своя сложность. Разработчик как-то не совсем адекватно относится к просьбам присылать готовые инсталляционные пакеты, пригодные для развертывания с помощью служб Active Directory. Поэтому остаётся одно - создавать нужные инсталляционные пакеты самостоятельно.

Итак, задача. Есть два файла, UUU.exe и AAA.upg. Нужно сделать инсталляционный пакет MMM.msi, который бы разархивировал эти два файла и затем выполнял команду "UUU.exe AAA.upg".

В качестве инструментов для решения этой задачи используются:
1. Архиватор 7-zip и его расширения для создания SFX-архивов (7-zip extra)
2. Конвертер исполняемых файлов в инсталляционные пакеты: http://www.exetomsi.com/freeware.php

Решение такое.

1. Создаём архив ZZZ.7z, содержащий два файла, UUU.exe и AAA.upg.

2. Из пакета 7-zip extra вытаскиваем файл 7zsd.sfx и кладём его рядом с архивом ZZZ.7z

3. Создаём файл config.txt с таким содержимым:
;!@Install@!UTF-8!
RunProgram="UUU.exe AAA.upg"
GUIMode="2"
;!@InstallEnd@!

4. Собираем самораспаковывающийся архив командой:
COPY /b 7zsd.sfx + config.txt + ZZZ.7z MMM.exe

5. Конвертируем получившийся исполняемый файл MMM.exe в MMM.msi

И, собственно, на этом всё.

Использовавшиеся источники:
http://7zsfx.info/ru/
http://paraglidernc.com/utilities/sfxsetup.htm

P.S. Важное дополнение. Оказывается, при публикации инсталляционных пакетов есть две возможности: назначить Пользовательский интерфейс при установке Простой или Полный. Простой интерфейс не позволяет создавать диалоговые окна, соответственно, если утилита UUU.exe хочет пообщаться с пользователем, процесс инсталляции вылетает с ошибкой "Не удалось назначить приложение *** из политики ***. Ошибка: в процессе установки произошла неисправимая ошибка".

Вышеуказанный конвертер генерирует пакеты, у которых этот самый Пользовательский интерфейс может быть только Простой. (Возможно, причина вот в этом: The Maximum UI option shows the UI that the author of the Windows Installer package defined.) Если требуется Полный интерфейс, то можно воспользоваться другим конвертером: http://www.exemsi.com/download.