Очень часто требуется создать такой установщик, который бы был способен устанавливать программу как в каталог %PROGRAMFILES% (при наличии прав локального администратора), так и в %LOCALAPPDATA% (при отсутствии оных).

В данном HOWTO мы подробно рассмотрим процесс создания такого инсталлятора, приведём примеры работающего кода и опишем подводные камни, которые вам могут встретится.

Создание инсталлятора

  1. Откройте исходный код сценария установки (файл *.iss) в любом текстовом редакторе или самой среде Inno Setup.

  2. В блоке [Setup] найдите директиву DefaultDirName и замените её следующую:

    DefaultDirName={code:GetDefRoot}\App Name
    

    Здесь App Name – название вашего приложения (каталог, в который будет установлена программа; рекомендуется использовать только латинские буквы и цифры).

  3. В этот же [Setup] добавьте:

    PrivilegesRequired=none
    

    У этой директивы возможны следующие значения:

    • admin (по умолчанию, либо если отсутствует в конфиге) – для работы созданного инсталлятора потребуются администраторские привилегии;
    • poweruser – потребуется членство в группе PowerUsers или Администраторы;
    • none – запуск возможен от любого пользователя, но если у пользователя есть права администратора, то они будут использоваться;
    • lowest – запуск также возможен от любого пользователя, но всегда будет использоваться права обычного пользователя (не рекомендуется).
  4. Теперь переходите в блок [Code] (если его нет, то создаём в самом конце скрипта) и пропишите две следующие функции:

    function GetDefRoot(Param: String): String;
    begin
      if not IsAdmin then
        Result := ExpandConstant('{localappdata}')
      else
        Result := ExpandConstant('{pf}')
    end;
    
  5. Соберите проект.

Подводные камни

  1. Не устанавливайте значение директивы PrivilegesRequired в lowest, т.к. в таком случае программа установки будет всегда работать с правами пользователя и установиться в %PROGRAMFILES% не сможет.

  2. В случае если вы собираетесь устанавливать динамические библиотеки или например шрифты в системные каталоги Windows, то обязательно делайте дополнительную проверку, например:

    Source: "dll\isxdl.dll"; DestDir: "{app}"; Flags: ignoreversion; Check: not IsAdmin()
    

    В противном случае вы получите критическую ошибку.

  3. При записи в разделы реестра, отличные от HKEY_CURRENT_USER, также делайте проверку наличия прав администратора (аналогично файлам).

Примеры

Готовый пример вы можете найти в нашем git репозитории проекта SRC Repair.