Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » .: NSIS - все вопросы :. часть 2.

Ответить
Настройки темы
.: NSIS - все вопросы :. часть 2.

Аватара для kotkovets

Ветеран


Сообщения: 1216
Благодарности: 486


Конфигурация

Профиль | Отправить PM | Цитировать


Изменения
Автор: kotkovets
Дата: 07-06-2020
Описание: NSIS 3.05


Данная тема предназначена для обсуждения вопросов, связанных с инсталлятором Nullsoft Scriptable Install System, или просто NSIS. Сайт приложения.


Описание:
читать дальше »
NSIS (Nullsoft Scriptable Install System) - профессиональная система для создания инсталляторов в среде Windows с октрытым исходным кодом. При своем малом размере система очень гибкая, и при с широкими возможностями. Генерируемый ею инсталлятор также имеет очень маленький размер и идеально подходит для распространения продукта через Интернет.


Текущая версия: NSIS 3.05 от 15 декабря 2019 года
Скачать | Архив сборок версии

Первая часть этой темы
Скачать первую часть этой темы одним архивом

ВНИМАНИЕ! прежде, чем задать вопрос, почитайте, где Вы найдете ответы на большинство вопросов:
Справочник по NSIS - создан силами нашего сообщества.
Руководство пользователя. Перевод – Поляков А.В, зеркало

Документация

Утилиты разработчика
Расширение функциональности

Примеры скриптов на нашем форуме
Скрипт NSIS для перепаковки AIMP2+Сборки
Тема для Notepad++(пример парсинга XML)

Достоинства
читать дальше »


◦ Очень маленький размер установочного блока (около 34 Кбайт)
◦ zlib, bzip2 и LZMA-сжатие
◦ Гибкая система скриптов (спецально разработанная для инсталляторов)
◦ Поддержка многоязычности, точнее 53 языка, есть возможность ввода нового языка
◦ Поддержка плагинов
◦ Скрипт Препроцессор
◦ Создание Web-инсталляторов


Ещё немного полезной информации:
читать дальше »

▫ История создания установщика

NSIS создан как альтернатива InstallShield, предназначенного для коммерческих продуктов.

NSIS был создан для распространения Winamp. Он базируется на предыдущем продукте Nullsoft — PiMP (plugin Mini Packager), иначе известным как SuperPiMP. После версии 2.0a0, проект был перемещён на SourceForge.net, где к работе над ним присоединились и сторонние разработчики. NSIS 2.0 был выпущен в свет 2 года спустя.

NSIS версии 1 был очень похож на классический Windows Installer, но он был более управлемым с помощью скриптов и поддерживал другие форматы сжатия. NSIS версии 2 поддерживает новый графический интерфейс пользователя, LZMA-сжатие, многоязычность и имеет хорошую систему плагинов.

Версия 2.01 была первой версией, поддерживающей компиляцию на любой из POSIX-платформ. Это позволило создавать Windows-инсталляторы на GNU/Linux и FreeBSD без использования эмулятора Wine. На данный момент поддерживается компиляция только для Windows.

▫ Описание

Компилятор NSIS — программа makensis — компилирует скрипты в исполняемый код. Каждая строчка скрипта содержит одну команду. Пример:
Код: Выделить весь код
 # Пример скрипта
 Name "Example1"
 OutFile "example1.exe"
 InstallDir "$PROGRAMFILES\Example1"
 Page Directory
 Page InstFiles
 Section
   SetOutPath $INSTDIR
   File ..\makensis.exe
 SectionEnd

Modern User Interface

В версии 2.0 был введён новый графический интерфейс пользователя, названный Modern UI (MUI). MUI очень похож на интерфейс мастеров, он поддерживает splash screen, выбора языка, выбор компонентов для установки и более широкие возможности настройки по сравнению со своим предшественником. Пример:
Код: Выделить весь код
 # Пример скрипта с Modern UI
 !include MUI.nsh
 Name "Example 2"
 OutFile Example2.exe
 !insertmacro MUI_PAGE_WELCOME
 !insertmacro MUI_PAGE_LICENSE "license.rtf"
 !insertmacro MUI_PAGE_DIRECTORY
 !insertmacro MUI_PAGE_COMPONENTS
 !insertmacro MUI_PAGE_INSTFILES
 !insertmacro MUI_PAGE_FINISH
 !insertmacro MUI_LANGUAGE "English"
 !insertmacro MUI_LANGUAGE "German"
 !insertmacro MUI_LANGUAGE "French"
 Section "Extract makensis"
  SetOutPath $INSTDIR
  File ..\makensis.exe
 SectionEnd
NSIS может быть расширен при помощи плагинов, которые могут быть написаны на C++, Си, и Delphi. Плагины могут быть использованы для улучшения функциональности и интерфейса инсталлятора. Плагины могут быть вызваны в любой части кода NSIS скрипта.

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

▫ Программы, использующие NSIS


◦ Антивирус Касперского
◦ Qip
◦ 3DNA Desktop
◦ 7-Zip
◦ ATI Display Driver
◦ CDex
◦ Dev-C++
◦ DivX
◦ eMule FileZilla
◦ Google Picasa
◦ Google Talk
◦ Intel C (компилятор)
◦ IrfanView
◦ LightAllow
◦ LyX
◦ Miranda IM Mozilla Firefox 2.0
◦ NASA World Wind
◦ Notepad++
◦ OpenOffice.org для Windows
◦ Pidgin
◦ VLC Player
◦ Winamp

▫ Чем я могу распаковать инсталлятор, созданный в NSIS?

В настоящее время инсталляторы NSIS не могут быть полностью декомпилированы. Сам инсталлятор не содержит в себе никаких функций для того, чтобы извлечь сценарий и/или файлы без инсталляции. Это - выбор разработчика, доступны ли исходный текст и/или файлы для инсталлятора для публики или нет. Есть, однако, внешние инструментальные средства, которые позволяют это сделать. 7-zip поддерживает частичную распаковку NSIS инсталляторов с алгоритмом сжатия lzma или bzip. Так же существует мульти-архивный плагин для TotalCommander.
Небольшая заметка для разработчиков: используйте DCryptDll, если хотите скрыть некоторые файлы в вашей инсталляции.


-------
Спасибо ВСЕМ за то, что тратите свое время, что бы ПОМОЧЬ МНЕ.

Это сообщение посчитали полезным следующие участники:

Отправлено: 12:02, 09-12-2012

 

Пользователь


Сообщения: 93
Благодарности: 2

Профиль | Отправить PM | Цитировать


Всем доброго дня.
Тут застрял на такой проблеме, существует ли в NSIS команда, чтобы узнать, находится ли компьютер в домене?
Нашел только это https://nsis.sourceforge.io/WmiInspector_plug-in но оно даже не компилится в юникоде. Тест выдает какие то китайские иероглифы.
Нужно что нибудь простое, типа "да или нет". Как, например в батнике "wmic.exe ComputerSystem get PartOfDomain"

Отправлено: 16:02, 07-07-2023 | #2751



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Старожил


Сообщения: 352
Благодарности: 192

Профиль | Отправить PM | Цитировать


inco1, А есть под рукой для теста комп в домене, на котором это проверить можно?

Наиболее подходящий вариант, похоже, NetGetJoinInformation
Код: Выделить весь код
; https://learn.microsoft.com/en-gb/windows/win32/api/lmjoin/nf-lmjoin-netgetjoininformation
System::Call 'netapi32::NetGetJoinInformation(i 0, *t 0 r0, *i 0 r1)i.r2'
${If} $2 != 0
  DetailPrint 'error!'
${Else}
  ${Select} $1
    ${Case} 0
      StrCpy $2 'NetSetupUnknownStatus'
    ${Case} 1
      StrCpy $2 'NetSetupUnjoined'
    ${Case} 2
      StrCpy $2 'NetSetupWorkgroupName'
    ${Case} 3
      StrCpy $2 'NetSetupDomainName'
  ${EndSelect}
  DetailPrint 'name="$0" joinstatus="$2"'
${EndIf}
Другие варианты:
- GetComputerNameEx и NetWkstaGetInfo из этого поста
GetComputerNameEx для ComputerNameDnsDomain (2) для компа не в домене возвращает пустой результат
NetWkstaGetInfo возвращает имя либо домена либо рабочей группы, посему ненадёжна для данной задачи

- Реестр, пустое значение == комп не в домене (надо проверять на корректность)
ReadRegStr $0 HKLM "System\CurrentControlSet\Services\Tcpip\Parameters" "Domain"
ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\State\Machine" "Distinguished-Name"
Это сообщение посчитали полезным следующие участники:

Отправлено: 21:37, 07-07-2023 | #2752


Пользователь


Сообщения: 93
Благодарности: 2

Профиль | Отправить PM | Цитировать


iglezz, Спасибо. Компа нету чтобы проверить, но буду искать и всё попробую.

Отправлено: 23:16, 07-07-2023 | #2753


Пользователь


Сообщения: 93
Благодарности: 2

Профиль | Отправить PM | Цитировать


iglezz,
Я правильно понял ваш код?
Код: Выделить весь код
RequestExecutionLevel user
outfile test.exe
!include LogicLib.nsh

Section

System::Call 'netapi32::NetGetJoinInformation(i 0, *t 0 r0, *i 0 r1)i.r2'

${If} $2 != 0

MessageBox MB_OK "компьютер в домене"
${Else}
MessageBox MB_OK "компьютер НЕ в домене"
${EndIf}

SectionEnd
Я правильно понял код от MKN?
Код: Выделить весь код
RequestExecutionLevel user
outfile test2.exe
!include LogicLib.nsh

Section

System::Call 'kernel32.dll::GetComputerNameExA(i 2, t .r0,*i ${NSIS_MAX_STRLEN} r1)i.r2'

${If} $0 == 0

MessageBox MB_OK "компьютер в домене"
${Else}
MessageBox MB_OK "компьютер НЕ в домене"
${EndIf}

SectionEnd

Последний раз редактировалось inco1, 08-07-2023 в 08:17.


Отправлено: 07:59, 08-07-2023 | #2754


Старожил


Сообщения: 352
Благодарности: 192

Профиль | Отправить PM | Цитировать


inco1,
Для обеих функций результат будет иметь минимум три значения - да, нет, ошибка/не_знаю

В случае NetGetJoinInformation полноценный вариант в виде макроса будет выглядеть так:
NetGetJoinInformation macro
Код: Выделить весь код
/*  NetGetJoinInformation macro
    
      Retrieves join status information for the specified computer

    Usage:

      ${NetGetJoinInformation} in_computerName out_joinToName out_joinStatus
    
    Parameters:

      in_computerName - DNS or NetBIOS name of the computer on which to call the function. 
                        If this parameter is '' or -, the local computer is used.

      out_joinToName  - NetBIOS name of the domain or workgroup to which the computer is joined
                        If this parameter is '' or -, the value is not used.

      out_joinStatus  - Join status of the specified computer:
        success:
        0 = NetSetupUnknownStatus
        1 = NetSetupUnjoined
        2 = NetSetupWorkgroupName
        3 = NetSetupDomainName
        failure:
        -SYSTEM_ERROR_CODE, e.g. -53 == ERROR_BAD_NETPATH (53)
        https://learn.microsoft.com/en-us/windows/win32/debug/system-error-codes--0-499-

    https://learn.microsoft.com/en-gb/windows/win32/api/lmjoin/nf-lmjoin-netgetjoininformation
*/
!define NetGetJoinInformation `!insertmacro NetGetJoinInformation `
!macro  NetGetJoinInformation in_computerName out_joinToName out_joinStatus
  !if '${in_computerName}' == '-'
  Push ''
  !else
  Push '${in_computerName}'
  !endif
  Exch $0
  Push $1
  Push $2

  System::Call '*(i)p.r1'
  System::Call 'netapi32::NetGetJoinInformation(t r0, @ r2, p r1)i.r0'

  !if '${out_joinToName}' == ''
  !define /redef out_joinToName -
  !endif
  !if ${out_joinToName} != '-'
  !define NetGetJoinInformation[jmp] +5
  !else
  !define NetGetJoinInformation[jmp] +4
  !endif

  StrCmp $0 0 0 ${NetGetJoinInformation[jmp]}
  ;ok
  System::Call '*$1(i.r0)' ; get status
  System::Free $1
  !if ${out_joinToName} != '-'
  System::Call '*$2(t.r1)' ; get name
  !endif
  Goto +3
  ;not ok
  StrCpy $0 -$0 ; -SYSTEM_ERROR_CODE
  StrCpy $1 ''

  !undef NetGetJoinInformation[jmp]

  StrCmp $2 0 +2
    System::Call "netapi32::NetApiBufferFree(pr2)"

  Pop $2
  !if ${out_joinToName} != '-'
  Exch $1 ; name
  Pop ${out_joinToName}
  !else
  Pop $1
  !endif
  Exch $0
  Pop ${out_joinStatus}
!macroend


Для локальной машины ${NetGetJoinInformation} '' '' $R0 или ${NetGetJoinInformation} - - $R0
запишет в $R0 результат:
- Отрицательный результат = ошибка
- Неотрицательный результат:
3 = однозначно в домене
1,2 = однозначно не в домене
0 = неизвестно

В простейшем случае, когда (однозначно в домене == Да, в остальных случаях == Нет), можно добавить LogicLib-тест
Код: Выделить весь код
!define IsInDomain `"" IsInDomain`
!macro _IsInDomain _a _b _t _f
  !insertmacro _LOGICLIB_TEMP
  ${NetGetJoinInformation} `${_b}` - $_LOGICLIB_TEMP
  StrCmp $_LOGICLIB_TEMP 3 `${_t}` `${_f}`
!macroend
Тогда проверочное выражение сократится до
Код: Выделить весь код
${If} ${IsInDomain} ''
  DetailPrint 'in domain'
${Else}
  DetailPrint 'not in domain'
${EndIf}
Это сообщение посчитали полезным следующие участники:

Отправлено: 13:44, 08-07-2023 | #2755


Пользователь


Сообщения: 93
Благодарности: 2

Профиль | Отправить PM | Цитировать


Чтобы не лезть в дебри дал проверить на компе в домене. Отлично работает поиск через реестр. Работают обе строки. Этого более чем достаточно.

Код: Выделить весь код
RequestExecutionLevel user
outfile test3.exe
SilentInstall silent
!include x64.nsh
!include LogicLib.nsh

Function .onInit

Var /GLOBAL Domain
Var /GLOBAL Dom
StrCpy $Dom "" 

      ${If} ${RunningX64}
      SetRegView 64
      ReadRegStr $Domain HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\State\Machine" "Distinguished-Name"
      SetRegView 32
      ${Else}
      ReadRegStr $Domain HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\State\Machine" "Distinguished-Name"
      ${EndIf}        

FunctionEnd

Section

${If} $Domain == $Dom

MessageBox MB_OK "      Компьютер НЕ в домене "
${Else}
MessageBox MB_OK "      Компьютер в домене "
${EndIf}

SectionEnd
Код: Выделить весь код
RequestExecutionLevel user
outfile test4.exe
SilentInstall silent
!include LogicLib.nsh

Function .onInit

Var /GLOBAL Domain
Var /GLOBAL Dom
StrCpy $Dom "" 

      ReadRegStr $Domain HKLM "System\CurrentControlSet\Services\Tcpip\Parameters" "Domain"

FunctionEnd

Section

${If} $Domain == $Dom

MessageBox MB_OK "      Компьютер НЕ в домене "
${Else}
MessageBox MB_OK "      Компьютер в домене "
${EndIf}

SectionEnd

Отправлено: 14:08, 08-07-2023 | #2756


Старожил


Сообщения: 352
Благодарности: 192

Профиль | Отправить PM | Цитировать


inco1,
В этом фрагменте нет смысла дублировать ReadRegStr:
Код: Выделить весь код
${If} ${RunningX64}
SetRegView 64
ReadRegStr $Domain HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\State\Machine" "Distinguished-Name"
SetRegView 32
${Else}
ReadRegStr $Domain HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\State\Machine" "Distinguished-Name"
${EndIf}
Он сокращается до
Код: Выделить весь код
${IfThen} ${RunningX64} ${|} SetRegView 64 ${|}     
ReadRegStr $Domain HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\State\Machine" "Distinguished-Name"
SetRegView lastused
и дальше сверять можно с пустым значением
Код: Выделить весь код
${If} $Domain == ""
  MessageBox MB_OK "      Компьютер НЕ в домене "
${Else}
  MessageBox MB_OK "      Компьютер в домене "
${EndIf}
Это сообщение посчитали полезным следующие участники:

Отправлено: 15:37, 08-07-2023 | #2757


Пользователь


Сообщения: 93
Благодарности: 2

Профиль | Отправить PM | Цитировать


iglezz,

А можно ли сократить, к примеру вот такой фрагмент:
Код: Выделить весь код
      SetRegView 64
        DeleteRegKey HKEY_LOCAL_MACHINE "Software\Classes\CLSID\test"
      SetRegView 32
        DeleteRegKey HKEY_LOCAL_MACHINE "Software\Classes\CLSID\test"

Отправлено: 09:00, 09-07-2023 | #2758


Старожил


Сообщения: 352
Благодарности: 192

Профиль | Отправить PM | Цитировать


inco1,
Для эпизодически встречающихся одиночных инструкций можно написать макрос вроде такого:
Код: Выделить весь код
!define DeleteRegKey3264 `!insertmacro DeleteRegKey3264 `
!macro  DeleteRegKey3264 REGROOT REGKEY
  SetRegView 64
  DeleteRegKey ${REGROOT} '${REGKEY}'
  SetRegView 32
  DeleteRegKey ${REGROOT} '${REGKEY}'
!macroend
и далее использовать как ${DeleteRegKey3264} HKEY_LOCAL_MACHINE "Software\Classes\CLSID\test"

Если есть группа ключей, то её можно вынести в макрос и использовать его вместе с SetRegView:
Скрытый текст
Код: Выделить весь код
!macro DeleteSomeKeys
  DeleteRegKey HKEY_LOCAL_MACHINE ...
  DeleteRegKey HKEY_LOCAL_MACHINE ...
  ...
!macroend

...

SetRegView 64
!insertmacro DeleteSomeKeys
SetRegView 32
!insertmacro DeleteSomeKeys
Это сообщение посчитали полезным следующие участники:

Отправлено: 12:05, 09-07-2023 | #2759


Аватара для AlekseyPopovv

Старожил


Сообщения: 169
Благодарности: 6

Профиль | Отправить PM | Цитировать


iglezz, как создать xml файл с таким содержимым:
Код: Выделить весь код
<?xml version="1.0" encoding="UTF-8"?>
<RDLXSettings>
  <LangIDList/>
  <Common CreateBackupCopy="0" ShowSplashScreen="0">
    <AutoSave Enable="0" Interval="1"/>
  </Common>
  <ProjectHistory LoadlastProject="0" NoProject="1"/>
    <Spelling Type="1">
    <HunSpellDictionary Enabled="1">$EXEDIR\${APPDIR}\ru-RU.dic</HunSpellDictionary>
  </Spelling>
</RDLXSettings>
Соответственно потом нужно будет удалять строку:
Код: Выделить весь код
<HunSpellDictionary Enabled="1">$EXEDIR\${APPDIR}\ru-RU.dic</HunSpellDictionary>
А потом заново записывать эту строку.

Проблема со строкой:
Код: Выделить весь код
<Common CreateBackupCopy="0" ShowSplashScreen="0">
Она записывается так:
Код: Выделить весь код
<Common>CreateBackupCopy="0" ShowSplashScreen="0"</Common>
И как туда добавить:
Код: Выделить весь код
<AutoSave Enable="0" Interval="1"/>
ума не приложу...

Отправлено: 14:24, 11-07-2023 | #2760



Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » .: NSIS - все вопросы :. часть 2.

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Инфо - [ликбез] Помощь начинающим .:[все вопросы]:. часть 2 dimadr Наборы обновлений для Windows XP/2003/Windows 7 267 14-02-2020 08:25
[архив].: NSIS - все вопросы :. kotkovets Автоматическая установка приложений 3387 09-12-2012 11:56
Инфо - [ликбез] Помощь начинающим .:[все вопросы]:. часть 1 jameszero Наборы обновлений для Windows XP/2003/Windows 7 1491 22-07-2011 22:42
Выбор|модернизация процессора .:[все вопросы]:. Часть I Myxa Выбор отдельных компонентов компьютера и конфигурации в целом 1845 01-01-2011 19:18
Вопросы по создателю инсталляций NSIS MaxDELETE Программное обеспечение Windows 14 04-07-2007 10:01




 
Переход