Очень часто требуется создать такой установщик, который бы был способен устанавливать программу как в каталог %PROGRAMFILES% (при наличии прав локального администратора), так и в %LOCALAPPDATA% (при отсутствии оных).
В данном HOWTO мы подробно рассмотрим процесс создания такого инсталлятора, приведём примеры работающего кода и опишем подводные камни, которые вам могут встретится.
Создание инсталлятора
-
Откройте исходный код сценария установки (файл *.iss) в любом текстовом редакторе или самой среде Inno Setup.
-
В блоке [Setup] найдите директиву DefaultDirName и замените её следующую:
DefaultDirName={code:GetDefRoot}\App NameЗдесь App Name – название вашего приложения (каталог, в который будет установлена программа; рекомендуется использовать только латинские буквы и цифры).
-
В этот же [Setup] добавьте:
PrivilegesRequired=noneУ этой директивы возможны следующие значения:
- admin (по умолчанию, либо если отсутствует в конфиге) – для работы созданного инсталлятора потребуются администраторские привилегии;
- poweruser – потребуется членство в группе PowerUsers или Администраторы;
- none – запуск возможен от любого пользователя, но если у пользователя есть права администратора, то они будут использоваться;
- lowest – запуск также возможен от любого пользователя, но всегда будет использоваться права обычного пользователя (не рекомендуется).
-
Теперь переходите в блок [Code] (если его нет, то создаём в самом конце скрипта) и пропишите две следующие функции:
function GetDefRoot(Param: String): String; begin if not IsAdmin then Result := ExpandConstant('{localappdata}') else Result := ExpandConstant('{pf}') end; -
Соберите проект.
Подводные камни
-
Не устанавливайте значение директивы PrivilegesRequired в lowest, т.к. в таком случае программа установки будет всегда работать с правами пользователя и установиться в %PROGRAMFILES% не сможет.
-
В случае если вы собираетесь устанавливать динамические библиотеки или например шрифты в системные каталоги Windows, то обязательно делайте дополнительную проверку, например:
Source: "dll\isxdl.dll"; DestDir: "{app}"; Flags: ignoreversion; Check: not IsAdmin()В противном случае вы получите критическую ошибку.
-
При записи в разделы реестра, отличные от HKEY_CURRENT_USER, также делайте проверку наличия прав администратора (аналогично файлам).
Примеры
Готовый пример вы можете найти в нашем git репозитории проекта SRC Repair.