Table of Contents

Бесплатные средства создания инсталляторов MSI

https://stackoverflow.com/questions/50225031/windows-service-not-shown-in-add-remove-programs-under-control-panel/50229840#50229840

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
Основные утилиты:

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>

Инсталлятор не устанавливает никаких файлов. Он просто создает запись об установленном компоненте и запускает скрипт.