Бесплатные средства создания инсталляторов 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