Вот почти весь код (за исключением инклюдов..)
Правда, не думаю что он покажется вам легкочитаемым..
читать дальше »
Код:

; Все это добро накалякал jackrv[jackrv.org.ua].
; Версия компилятора: NSIS-2.46[ANSI]
; Используются плагины:
; - UltraModernUI[NSISSheild]
; - DotNetVer.nsh
; - Inetc
; При редактировании первое на что обратите внимание, так это строка [19] Константа {PRODUCT_PKG_DIR}
; Важно указать дирекотрию с исходными файлами продукта
; Следующие константы желательно подстроить под свой проект
!define PRODUCT_NAME "Etach Server" ; Имя проекта
!define PRODUCT_VERSION "3.1.1" ; Текущая версия
!define PRODUCT_FILENAME "Atott.Chat.Server.Manage.exe" ; Имя исполняемого файла
!define PRODUCT_UNFILENAME "uninst.exe" ; Имя файла деинсталяции
!define PRODUCT_PUBLISHER "Etach Group" ; Компания
!define PRODUCT_WEB_SITE "http://etach.ru" ; Офф.Сайт
!define PRODUCT_ICOFILE "${NSISDIR}\project\EtachClient\Orange128.ico" ; Иконка установцика
!define PRODUCT_UNICOFILE "${NSISDIR}\project\EtachClient\Silver128.ico" ; Иконка деинсталятора
!define PRODUCT_PKG_DIR "D:\Applications\NSIS\project\EtachClient\source" ; Путь к проекту на ЖД
!define URLDownloads "http://etach.ru/Downloads/" ; Адрес папки загрузки
!define FileDotNet "dotNetFx40_Full_x86_x64.exe" ; Имя инсталятора .Net FrameWork 4.0
!define URLEtachClient "" ; Имя файла инсталятора клиента
!define URLEtachServer "" ; Имя файла инсталятора сервера
; Нижеследующие константы изменять не нужно
!define PRODUCT_DIR_REGKEY "Software\${PRODUCT_FILENAME}" ; Ветвь реестра с доп.данными инсталятора
!define PRODUCT_UNKEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
!define /date NOW "%d.%m.%Y" ; Формируем сегодняшнюю дату
!define URLDotNet ${URLDownloads}${FileDotNet}
; Кое-какие переменные
Var Dialog
Var Label
Var Text
Var CheckBox
; --------------------------------------------------------------------------------------------------
; Установка компрессора
SetCompress force
SetCompressor /SOLID lzma
; --------------------------------------------------------------------------------------------------
; Основные настройки инсталятора
Name "${PRODUCT_NAME}" ; Имя програмы
Caption "$(LANG_CAPTION) ${PRODUCT_NAME} ${PRODUCT_VERSION}" ; Заголовок инсталятора
BrandingText "${PRODUCT_PUBLISHER}" ; Текст описания (на полоске, в низу)
OutFile "${PRODUCT_NAME}-${PRODUCT_VERSION}_build-${NOW}.exe" ; Имя файла после компиляции
InstallDir "$PROGRAMFILES\${PRODUCT_NAME}" ; Директория установки по-умолчанию
ShowInstDetails hide ; Не отображать список копируемых файлов
ShowUninstDetails hide ; Не отображать список удаляемых файлов
; Производим подключение вспомагательных скриптов
!include "DotNetVer.nsh" ; Проверка установленного .Net
!include "UMUI.nsh" ; Подключаем стильный дизайн
!include "LogicLib.nsh" ; Подключаем разширеную логику
!include "nsDialogs.nsh" ; Подключаем дополнительный редактор окон
; !include "macro.nsi" ; Мои макросы
; Настройки интерфейса
; Общие настройки
!define MUI_ABORTWARNING ; Подтвержление при выходе
!define MUI_COMPONENTSPAGE_NODESC ; MUI без описания (большая область для компонентов)
!define UMUI_USE_INSTALLOPTIONSEX
!define UMUI_PARAMS_REGISTRY_ROOT HKCU ; Ветка реестра для записи доп.данных инсталятора
!define UMUI_PARAMS_REGISTRY_KEY "${PRODUCT_DIR_REGKEY}" ; Путь в реестре для доп.данных
!define UMUI_INSTALLDIR_REGISTRY_VALUENAME "InstallPath" ; Имя переменной, хрянящей путь к инсталяции
!define UMUI_LANGUAGE_REGISTRY_VALUENAME "Language" ; Имя переменной, зранящей язык установки
!define UMUI_USE_ALTERNATE_PAGE
!define UMUI_SKIN "NSISShield"
; Установки иконок файлов
!define MUI_ICON "${PRODUCT_ICOFILE}" ; Иконка инсталятора
!define MUI_UNICON "${PRODUCT_UNICOFILE}" ; Иконка деинсталятора
; --------------------------------------------------------------------------------------------------
; Настройка страниц при установке
; Основные страницы
!insertmacro UMUI_PAGE_MULTILANGUAGE ; Страница выбора языка
; !insertmacro MUI_PAGE_LICENSE "$(License)" ; Страницв лицензии
!insertmacro MUI_PAGE_DIRECTORY ; Страница выбора директорий
Page custom fnCustomInit fnCustomDestroy
!insertmacro UMUI_PAGE_ADDITIONALTASKS addtasks_function
; Страница отображения сведений об установке
!define UMUI_CONFIRMPAGE_TEXTBOX confirm_function
!insertmacro UMUI_PAGE_CONFIRM ; Страница сведений утановки
!insertmacro MUI_PAGE_INSTFILES ; Страница выполнения скрипта
; Страница завершения установки
!define MUI_FINISHPAGE_NOAUTOCLOSE ; Не закрывать автоматичесски
; Чекбоксы на финишной странице, запуск программы и офф.сайт
!define MUI_FINISHPAGE_RUN RunProgram ; Путь к программе
!define MUI_FINISHPAGE_RUN_TEXT "$(LANG_FINISHRUN)" ; Текст на чекбоксе запуска
!define MUI_FINISHPAGE_RUN_CHECKED ; По-умолчанию выбрано
!define MUI_FINISHPAGE_LINK "$(LANG_FINISHURL)" ; Текст ссылки
!define MUI_FINISHPAGE_LINK_LOCATION "${PRODUCT_WEB_SITE}" ; Адрес офф.сайта
!insertmacro MUI_PAGE_FINISH ; Финишная страница
!insertmacro UMUI_PAGE_ABORT
; --------------------------------------------------------------------------------------------------
; Настройка деинсталятора
!insertmacro MUI_UNPAGE_INSTFILES ; Страница хода удаления
; --------------------------------------------------------------------------------------------------
; Настройка локализации
!insertmacro MUI_LANGUAGE "Russian" ; Подключаем Русс.яз.
!insertmacro MUI_LANGUAGE "English" ; Подключаем Англ.яз.
!insertmacro MUI_LANGUAGE "Ukrainian" ; Подключаем Укр.яз.
; Так-же подключаем файлы определений/переопределений языковых строк
!include "Language\ru.nsh"
!include "Language\en.nsh"
!include "Language\ua.nsh"
; --------------------------------------------------------------------------------------------------
; Макросы
!macro DotNetInstall
!insertmacro UMUI_ADDITIONALTASKS_IF_CKECKED DotNet
inetc::get /CAPTION "Загрузка .NET Framework 4.0" /CANCELTEXT "Отмена" /HEADER "Загрузка .Net Framework 4.0" /POPUP "${URLDotNet}" ${URLDotNet} "C:\dotnetfx.exe" /END
Pop $0
StrCmp $0 "OK" InstDotNet
Delete "C:\dotnetfx.exe"
Abort "Установка отменена."
InstDotNet:
ExecWait "C:\dotnetfx.exe"
Delete "C:\dotnetfx.exe"
!insertmacro UMUI_ADDITIONALTASKS_ENDIF
!macroend
; --------------------------------------------------------------------------------------------------
; Функция инициализации
Function .onInit
!insertmacro UMUI_MULTILANG_GET ; Выбор языка установки
!insertmacro MUI_INSTALLOPTIONS_EXTRACT "login.ini"
; !insertmacro CheckDotNet ; Проверка версии .Net
FunctionEnd
; Функция старта деинсталяции
Function un.onInit
MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "$(LANG_unOnInit)" IDYES +2
Abort
FunctionEnd
Function addtasks_function
${If} $R0 == ""
MessageBox MB_ICONINFORMATION|MB_OK|MB_DEFBUTTON2 "Имя администратора будет admin$\nВы можете вернуться на предыдущую страницу и указать нужный вам логин!"
${EndIf}
!insertmacro UMUI_ADDITIONALTASKSPAGE_ADD_LABEL "$(LANG_ADDITIONAL_ICONS)"
!insertmacro UMUI_ADDITIONALTASKSPAGE_ADD_TASK DESKTOP 1 "$(LANG_DESKTOP_ICON)"
!insertmacro UMUI_ADDITIONALTASKSPAGE_ADD_TASK QUICK_LAUNCH 0 "$(LANG_QUICK_LAUNCH_ICON)"
!insertmacro UMUI_ADDITIONALTASKSPAGE_ADD_EMPTYLINE
!insertmacro UMUI_ADDITIONALTASKSPAGE_ADD_LABEL "$(LANG_ADDITIONAL_DotNet)"
!insertmacro UMUI_ADDITIONALTASKSPAGE_ADD_TASK DotNet 0 "$(LANG_DotNet_ICON)"
FunctionEnd
; Функция отображения инфы об установке
Function confirm_function
StrCpy $R1 0
!insertmacro UMUI_CONFIRMPAGE_TEXTBOX_ADDLINE "$(UMUI_TEXT_INSTCONFIRM_TEXTBOX_DESTINATION_LOCATION)"
!insertmacro UMUI_CONFIRMPAGE_TEXTBOX_ADDLINE " - $INSTDIR"
!insertmacro UMUI_CONFIRMPAGE_TEXTBOX_ADDLINE ""
!insertmacro UMUI_ADDITIONALTASKS_IF_CKECKED DESKTOP
StrCpy $R1 1
!insertmacro UMUI_CONFIRMPAGE_TEXTBOX_ADDLINE "$(LANG_ADD_ICONS)"
!insertmacro UMUI_CONFIRMPAGE_TEXTBOX_ADDLINE " - $(LANG_ADD_ICONS_0)"
!insertmacro UMUI_ADDITIONALTASKS_ENDIF
!insertmacro UMUI_ADDITIONALTASKS_IF_CKECKED QUICK_LAUNCH
${If} $R1 = 0
!insertmacro UMUI_CONFIRMPAGE_TEXTBOX_ADDLINE "$(LANG_ADD_ICONS)"
StrCpy $R1 1
${EndIf}
!insertmacro UMUI_CONFIRMPAGE_TEXTBOX_ADDLINE " - $(LANG_ADD_ICONS_1)"
!insertmacro UMUI_ADDITIONALTASKS_ENDIF
${If} $R1 = 1
!insertmacro UMUI_CONFIRMPAGE_TEXTBOX_ADDLINE ""
${EndIf}
!insertmacro UMUI_ADDITIONALTASKS_IF_CKECKED DotNet
!insertmacro UMUI_CONFIRMPAGE_TEXTBOX_ADDLINE "$(LANG_ADD_PRGM)"
${If} ${HasDotNet4.0}
MessageBox MB_ICONINFORMATION|MB_OK|MB_DEFBUTTON2 "$(LANG_CheckDotNet1)"
${EndIf}
!insertmacro UMUI_CONFIRMPAGE_TEXTBOX_ADDLINE " - .Net Framework 4.0"
Goto End
!insertmacro UMUI_ADDITIONALTASKS_ENDIF
${If} ${HasDotNet4.0}
${Else}
MessageBox MB_ICONINFORMATION|MB_OK|MB_DEFBUTTON2 "$(LANG_CheckDotNet0)"
${EndIf}
${If} $R0 == ""
StrCpy $R0 "admin"
${EndIf}
!insertmacro UMUI_CONFIRMPAGE_TEXTBOX_ADDLINE "Админпанель"
!insertmacro UMUI_CONFIRMPAGE_TEXTBOX_ADDLINE " - Логин суперпользователя: $R0"
${If} $R9 = 1
!insertmacro UMUI_CONFIRMPAGE_TEXTBOX_ADDLINE " - Будет создан файл run.bat"
${EndIf}
!insertmacro UMUI_CONFIRMPAGE_TEXTBOX_ADDLINE ""
End:
FunctionEnd
Function RunProgram
Exec "$INSTDIR\${PRODUCT_FILENAME} admin:$R0"
FunctionEnd
Function fnCustomInit
nsDialogs::Create 1018
Pop $Dialog
SetCtlColors $Dialog "0x000000" "0x566978"
${NSD_CreateLabel} 5u 5u 100% 30u "Перед установкой вам необходимо указать логин будущего суперадминистратора.$\nЭтот пользователь будет иметь наивысшиее права, имейте это в виду!"
Pop $Label
SetCtlColors $Label "0xB4D3EA" "0x566978"
${NSD_CreateLabel} 25u 40u 150u 10u "Логин будущего суперадминистратора: "
Pop $Label
SetCtlColors $Label "0xB4D3EA" "0x566978"
${NSD_CreateText} 180u 38u 100u 15u ""
Pop $Text
SetCtlColors $Text "0xFFFFFF" "0x566978"
${NSD_CreateLabel} 5u 60u 100% 20u "По необходимости можно создать bat-файл$\nВ него будут занесены необходимые параметры для запуска сервера"
Pop $Label
SetCtlColors $Label "0xB4D3EA" "0x566978"
${NSD_CreateCheckBox} 10u 80u 100u 10u "Создать bat-файл"
Pop $CheckBox
SetCtlColors $CheckBox "0xB4D3EA" "0x566978"
${NSD_CreateLabel} 5u 100u 120% 30u "Важно!$\n Сервер изначально не настроен, т.е. не содержит никаких данных абсолютно!$\n Поэтому при первом входе вам нужно зарегистрироваться!"
Pop $Label
SetCtlColors $Label "0xFF9900" "0x566978"
nsDialogs::Show
FunctionEnd
Function fnCustomDestroy
${NSD_GetText} $Text $R0
${NSD_GetState} $CheckBox $R9
FunctionEnd
Function WriteToFile
Exch $0 ;file to write to
Exch
Exch $1 ;text to write
FileOpen $0 $0 a #open file
FileSeek $0 0 END #go to end
FileWrite $0 $1 #write to file
FileClose $0
Pop $1
Pop $0
FunctionEnd
!macro WriteToFile String File
Push "${String}"
Push "${File}"
Call WriteToFile
!macroend
!define WriteToFile "!insertmacro WriteToFile"
; --------------------------------------------------------------------------------------------------
; Секции установки (компоненты)
Section "!$(LANG_SECETACH)" SEC01
!insertmacro DotNetInstall
SetOutPath "$INSTDIR" ; Меняем паку распаковки
File "source\Atott.Core.dll"
File "source\Atott.Chat.Server.Manage.exe.config"
File "source\Atott.Chat.Server.Manage.exe"
File "source\Atott.Chat.Server.Core.dll"
File "source\Atott.Chat.Core.dll"
File "source\Atott.Chat.Client.Plugin.dll"
File "source\Atott.Chat.Client.Controls.dll"
WriteUninstaller "$INSTDIR\${PRODUCT_UNFILENAME}" ; Создаем деинсталятор
WriteIniStr "$INSTDIR\${PRODUCT_NAME}.url" "InternetShortcut" "URL" "${PRODUCT_WEB_SITE}" ; Создаем ярлык офф.сайта
; Ярлык на рабочем столе
!insertmacro UMUI_ADDITIONALTASKS_IF_CKECKED DESKTOP
CreateShortCut "$DESKTOP\${PRODUCT_NAME}.lnk" "$INSTDIR\${PRODUCT_FILENAME}" "admin:$R0" "$INSTDIR\${PRODUCT_UNFILENAME}" 0 SW_SHOWNORMAL ALT|CONTROL|SHIFT|F4 "$(LANG_ShRUN) $(^Name)"
!insertmacro UMUI_ADDITIONALTASKS_ENDIF
!insertmacro UMUI_ADDITIONALTASKS_IF_CKECKED QUICK_LAUNCH
CreateShortCut "$QUICKLAUNCH\${PRODUCT_NAME}.lnk" "$INSTDIR\${PRODUCT_FILENAME}" "admin:$R0" "$INSTDIR\${PRODUCT_UNFILENAME}" 0 SW_SHOWNORMAL ALT|CONTROL|SHIFT|F4 "$(LANG_ShRUN) $(^Name)"
!insertmacro UMUI_ADDITIONALTASKS_ENDIF
; Создание файла Run.bat
${If} $R9 == 1
${WriteToFile} "Atott.Chat.Server.Manage.exe admin:$R0" "$INSTDIR\Run.bat"
${EndIf}
; Регистрация деинсталятора
WriteRegStr HKCU "${PRODUCT_DIR_REGKEY}" "" "$INSTDIR\${PRODUCT_FILENAME}"
WriteRegStr HKLM "${PRODUCT_UNKEY}" "DisplayName" "$(^Name)"
WriteRegStr HKLM "${PRODUCT_UNKEY}" "UninstallString" "$INSTDIR\${PRODUCT_UNFILENAME}"
WriteRegStr HKLM "${PRODUCT_UNKEY}" "DisplayIcon" "$INSTDIR\${PRODUCT_FILENAME}"
WriteRegStr HKLM "${PRODUCT_UNKEY}" "DisplayVersion" "${PRODUCT_VERSION}"
WriteRegStr HKLM "${PRODUCT_UNKEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}"
WriteRegStr HKLM "${PRODUCT_UNKEY}" "Publisher" "${PRODUCT_PUBLISHER}"
SectionEnd
; --------------------------------------------------------------------------------------------------
; Секции деинсталятора
Section Uninstall
Delete "$INSTDIR\*.*"
Delete "$DESKTOP\${PRODUCT_NAME}.lnk"
RMDir /r "$INSTDIR"
DeleteRegKey HKLM "${PRODUCT_UNKEY}"
DeleteRegKey HKCU "${PRODUCT_DIR_REGKEY}"
SectionEnd
; --------------------------------------------------------------------------------------------------
; Информация о файле (о том что после компиляции появляется)
VIProductVersion ${PRODUCT_VERSION}.0
VIAddVersionKey /LANG=${LANG_RUSSIAN} ProductName "${PRODUCT_NAME}"
VIAddVersionKey /LANG=${LANG_RUSSIAN} ProductVersion "${PRODUCT_VERSION}"
VIAddVersionKey /LANG=${LANG_RUSSIAN} CompanyName "${PRODUCT_PUBLISHER}"
VIAddVersionKey /LANG=${LANG_RUSSIAN} CompanyWebsite "${PRODUCT_WEB_SITE}"
VIAddVersionKey /LANG=${LANG_RUSSIAN} FileVersion "${PRODUCT_VERSION}"
VIAddVersionKey /LANG=${LANG_RUSSIAN} FileDescription "${PRODUCT_PUBLISHER}"
VIAddVersionKey /LANG=${LANG_RUSSIAN} LegalCopyright "Copyright © ${PRODUCT_PUBLISHER}"
VIAddVersionKey /LANG=${LANG_RUSSIAN} Comments "Windows XP, Vista, Win7 $\t .Net Framework 4.0"
VIAddVersionKey /LANG=${LANG_RUSSIAN} OriginalFilename "${PRODUCT_FILENAME}"