Доброго времени суток! Наверное многим приходилось собирать небольшие устанощики разнообразного ПО для своих нужд или нужд компании работодателя. В моей работе приходится сталкиваться с самыми разнообразными задачами по написанию всякого мелкого админского ПО. Начиная от скриптов настройки файрволов и установшика службы VNC до инсталлятора корпоративного мессенджера на основе Miranda. На последнем мы сегодня и остановимся. Реализовав ввод логина и пароля прямиком в установщике, посредством вызова «Page custom» и работы с функционалом NSD




И так. Наша задача заключается в создании инсталлятора с вводом логина и пароля во время установки. Для формирования интерфейса будем использовать NSISDialogDesigner. Очень рекомендую данное ПО для упрощения создания своих страничек в установщике. Программа совершенно бесплатная и имеет большой набор функционала. Слева набор элементов управления, справа свойства элементов и самого окна, снизу готовый код для вставки в NSIS, он формируется в реальном времени.



Вам упростит жизнь указание выполнения нужных функций прямо в NSISDialogDesigner. Это будет полезно для создания более сложных интерфейсов в несколько страниц. Т.к. копаться в этом коде уже в NSIS достаточно нудно.



Рассписывать все шаги создания я не буду. На выходе мы должны получить вот такой интерфейс. Поле для ввода у меня специально сделано обычным тестовым полем. Но вы конечно же можете использовать поле ввода пароля, для скрытия символов.



Далее вставляем сформированный код в проект NSIS. И вписываем свою страницу в список. У меня описание элементов MUI в данном случае выглядит примерно так. Полный файл nsi вы найдёте в конце записи.

!define MUI_ICON «D:\Jabber_2013\ico.ico»
!insertmacro MUI_LANGUAGE «Russian»
Page custom fnc_Jabber_2013_Show
!insertmacro MUI_PAGE_INSTFILES


Далее нам предстоит организовать работу с переменными интерфейса. Сразу вам говорю, что просто так из hCtl_Jabber_2013_TextBox1 у вас не выйдет получить набранный внутри текст. Для этого нам нужно использовать ${NSD_GetText} $hCtl_Jabber_2013_TextBox1 $0 Командой ${NSD_SetText} $hCtl_Jabber_2013_TextBox1 $0 мы наоборот можем отправить свою переменную внутрь TextBox1. При помощи NSD вы можете использовать и другие параметры элементов, например видимость или стиль/цвет.

Далее напишем функции обработки изменений внутри наших TextBox. У меня они выглядят так.

Function PatchCh1
${NSD_GetText} $hCtl_Jabber_2013_TextBox1 $4
${NSD_SetText} $hCtl_Jabber_2013_TextBox3 C:\Jabber_$4
${NSD_GetText} $hCtl_Jabber_2013_TextBox2 $5
${NSD_GetText} $hCtl_Jabber_2013_TextBox3 $3
FunctionEnd

Function PatchCh2
${NSD_GetText} $hCtl_Jabber_2013_TextBox2 $5
FunctionEnd

Function PatchCh3
${NSD_GetText} $hCtl_Jabber_2013_TextBox3 $3
FunctionEnd


Как видите, исходя из логина будет автоматически меняться и путь установки. PatchCh2 и PatchCh3 нужны для получения переменных пароля и самого пути установки.

Далее у нас идёт секция установки.

Section «Jabber»
SetOutPath "$3"
File /r «D:\Jabber_2013\Jabber\*»
CreateShortCut "$DESKTOP\$4.lnk" "$3\miranda32.exe"
${WriteToFile} `$3\pass.x` `$5`
${WriteToFile} `$3\logg.x` `$4`
nsExec::Exec "$3\start.bat"
SectionEnd


Для генерации autoexec.ini и записи в него пароля и логина я использую скрипт под sed. Его прилагаю вместе с исходником. Если кто-то сможет предложить более изящный способ, буду очень благодарен. Т.к. сейчас это выглядит так:

start.bat содержит

Set /p logg=<logg.x
sed -rf too.sed pass.x > pass_clear.x
echo [JABBER]>autoexec.ini
echo LoginName=s%logg%>>autoexec.ini
echo jid=s%logg%server.com>>autoexec.ini
sed -f dop.sed pass_clear.x >> autoexec.ini


too.sed содержит магическое заклинание:

y/`0123456789-=\\qwertyuiop[]asdfghjkl;'zxcvbnm,.\/ ~!@#$%^&*()_+|QWERTYUIOP{}ASDFGHJKL:«ZXCVBNM<>?/e56789:;<=>2Bav|jwy~zntu`bfxiklmopq@,}h{gsr134%ѓ&E()*c+\/-.d0ЃV\\JWY^ZNTUЂ‚FXIKLMOPQ?'_]H[GSRACD/

Обьясню, autoexec.ini — это файл автоматической настройки Miranda. В нём вы можете указать логин (в открытом виде), пароль (в зашифрованном виде), jid для подключения и некоторые другие настройки.

В итоге получаем нечто вот такое:



Файлы проекта

Надеюсь, кому-то эта запись пригодится. Спасибо!

Комментарии (10)


  1. UksusoFF
    10.09.2013 15:06

    Создание своих страничек в установщике? Что это?


    1. PlazmX Автор
      10.09.2013 15:06

      «Page custom» в NSIS. Как вы ещё предложите это назвать по русски?


      1. UksusoFF
        10.09.2013 15:06

        «Установщик с дополнительными возможностями» суть другая но зато понятней о чем речь.


  1. yosemity
    10.09.2013 15:06

    корпоративного мессенджера на основе Miranda

    Конкретно Miranda прекрасно умеет SSO, а в корпоративной среде юзерам свойственно менять пароли. К тому же софт явно не должен ставиться с правами юзера. Кто в таком случае будет вводить пароль, SYSTEM? Если ставить в домашнюю директорию — тоже не айс, не по феншую.

    Правильней было бы устанавливать миранду автоматически всем и сделать кастомный лаунчер. При запуске лаунчер проверяет существование профиля юзера, при необходимости выводит окно логина и пароля (если уж SSO не прикрутили) и когда все готово запускает экзешник миранды. Я кстати так и сделал, при чем с SSO и вообще не парюсь, где бы юзер не залогинился у него всегда автоматически стартанет миранда под его (юзера) учеткой.


    1. PlazmX Автор
      10.09.2013 15:06

      Тут вы правы. Но не в наших условиях. Грубо говоря, у нас больше 500 удалённых узлов, на которых по 3-4 человека. Россия и ближнее зарубежье. Компьютеры там часто меняются (история не хранится кст), а люди совершенно далеки от технологий. В центральном офисе у нас всё по феншую, но не о нём речь)


  1. pROCKrammer
    10.09.2013 15:06

    Вспомнил времена Delphi, когда паковали свои приложения на NSIS.


    1. PavelSandovin
      10.09.2013 15:06

      Вроде бы и сейчас продолжают. Какие альтернативы посоветуете?


  1. Indexator
    10.09.2013 15:06

    Приходилось мне писать хитровывернутые инсталляторы на NSIS, должен сказать — это дикий трэш и угар. Да, он обладает весьма широкими возможностями и кучей расширений, но этот его собственный язык написания скриптов, его синтаксис, логика выполнения порой взрывают мозг… Такое впечатление, что NSIS представляет из себя огромную коллекцию костылей и заплаток… А его код порой напоминает чуть ли не ассемблерный…


    1. PlazmX Автор
      10.09.2013 15:06

      Полностью с вами согласен. Вот… Кусок кода. Я долго разбирал написанное…

      ; StrCpy $input «084069083084»
      ; StrCpy $counter 0
      ; StrCpy $output ""
      ; StrCpy $subdigits $input 3 $counter
      ; _loop:
      ; StrCpy $firstdigit $subdigits 1
      ; StrCmp $firstdigit «0» 0 +2
      ; StrCpy $subdigits $subdigits 2 1
      ; IntFmt $char "%c" $subdigits
      ; StrCpy $output "$output$char"
      ; IntOp $counter $counter + 3
      ; StrCpy $subdigits $input 3 $counter
      ; StrCmp $subdigits "" 0 _loop
      ; MessageBox MB_OK $output
      ; Abort

      Но ко всему NSIS, практически, самый функциональный пакет инсталляции. Плюс ко всему он совершенно бесплатный. Ну а когда всё в фирме им собирается, знаний и манов по нему накапливается много и реализация задач становится не столь трудоёмкой.


      1. PavelSandovin
        10.09.2013 15:06

        Ничто не мешает делать отступы, как делают все нормальные люди, чтобы написать читаемый код.
        Например, после StrCmp — это же условный оператор — следует делать отступ:

        StrCmp $firstdigit "0" 0 +2
            StrCpy $subdigits $subdigits 2 1
        IntFmt $char "%c" $subdigits
        


        Если следить за собой, код получается вполне понятный.