Бесплатные средства создания инсталляторов MSI
Wix
http://citforum.ru/internet/xml/wix/
https://www.firegiant.com/wix/tutorial/
https://www.codeproject.com/Tips/105638/A-quick-introduction-Create-an-MSI-installer-with
https://habr.com/ru/post/68616/
https://damienbod.com/2013/09/01/wix-installer-with-powershell-scripts/
https://github.com/damienbod/WiXPowerShellExample
Wix (Windows Installer XML) - это набор утилит, предназначенный для создания инсталляционных пакетов (msi). Пригоден для создания сложных инсталляторов (утверждают, что инсталлятор MS Office (неясно какой версии) был полностью создан с помощью Wix)
Описание этапов установки хранится в xml-файлике - wsx.
Утилиты, входящие в набор WiX
Описание утилит, входящих в набор - https://wixtoolset.org/documentation/manual/v3/overview/alltools.html
Основные утилиты:
- candle - Компилятор, который создает из исходных (wsx) файлов объектные (wixobj).
- light - Линкер, который использует объектный wixobj-файл и создает на его основе msi- или msm-файл.
- dark - Декомпилятор, который разбирает существующий msi- или msm-файл и создает wsx-файл.
XML-структура wsx-файла
Product
Основным объектом верхнего уровня в терминах WiX является продукт (Product).Одна инсталляция устанавливает один продукт. Продуктом имеет уникальный идентификатор GUID, который представляет собой уникальное 128-битное число.
Package
Следующим (после продукта) уровнем иерархии является пакет (Package). Он может включать один или несколько файлов — обычно файлы инсталляции msi, msm (MS Merge Modules) и архивы cab.
Feature
Весь продукт состоит из опций (Features). Опции — это то, что видит пользователь при инсталляции и что он может выбрать (или не выбирать) для инсталляции. Опции имеют иерархическую структуру: одни features могут содержать в себе другие.
Component
Каждый отдельный элемент инсталляции, такой как файл, ключ реестра и т.д., называется компонентом (Component). Компоненты также имеют уникальные ключи GUID (не зависимо от устанавливаемого пакета).
Сборка пакета msi
Сборка пакета msi происходит в два этапа:
candle.exe Sample.wxs
на выходе - файл wixobj
light.exe Sample.wixobj
на выходе - пакет msi.
Запуск Powershell-скрипта инсталлятором msi
Мне нужно создать инсталлятор msi, который бы мог запускаться с правами непривилегированного пользователя, скачивать powershell-скрипт с http-сервера и запускать его (для распространения средствами SCCM).
wxs-файл, с помощью которого создается нужный msi выглядит так:
<?xml version="1.0" encoding="UTF-8"?> <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:util="http://schemas.microsoft.com/wix/UtilExtension"> <Product Id="*" Name="WSL and XServer for Windows" Language="1033" Version="0.0.1" Manufacturer="Sberleasing" UpgradeCode="121F564B-ACAB-DEAD-BEEF-C9B8C11C381A"> <Package Id="*" InstallerVersion="305" InstallScope="perMachine" InstallPrivileges="elevated" Compressed="yes" /> <Media Id="1" /> <Property Id="MSIUSEREALADMINDETECTION" Value="1" /> <Condition Message="Installation requires Administrator privileges"> <![CDATA[Privileged]]> </Condition> <Directory Id="TARGETDIR" Name="SourceDir"> <Component Id="Component_WSL_and_XServer_for_Windows" Guid='1b3844ef-ACAB-DEAD-BEEF-7786e2d5a6c7' /> </Directory> <Property Id='POWERSHELL'>C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe</Property> <!-- My custom actions install scripts--> <CustomAction Id="RunInstallScript" Property="POWERSHELL" ExeCommand='-windowstyle hidden -command $url=\"http://nexus.rdleas.ru/repository/files/JavaDeveloperTools_SetupScripts/Setup_WSL.ps1\"; iex ((New-Object System.Net.WebClient).DownloadString($url))' Return='check' /> <Feature Id="Feature_WSL_And_XServer" Title='WSL and XServer For Windows' Level="1"> <ComponentRef Id="Component_WSL_and_XServer_for_Windows" /> </Feature> <InstallExecuteSequence> <Custom Action="RunInstallScript" After="InstallFinalize"></Custom> </InstallExecuteSequence> <MajorUpgrade Schedule="afterInstallInitialize" AllowDowngrades="no" DowngradeErrorMessage="ok" AllowSameVersionUpgrades="yes" /> </Product> </Wix>
Инсталлятор не устанавливает никаких файлов. Он просто создает запись об установленном компоненте и запускает скрипт.
Discussion