|
Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » .: NSIS - все вопросы :. часть 2. |
|
.: NSIS - все вопросы :. часть 2.
|
Ветеран Сообщения: 1216 |
Профиль | Отправить PM | Цитировать
Данная тема предназначена для обсуждения вопросов, связанных с инсталлятором Nullsoft Scriptable Install System, или просто NSIS. Сайт приложения. Описание: Текущая версия: NSIS 3.05 от 15 декабря 2019 года Скачать | Архив сборок версии Первая часть этой темы Скачать первую часть этой темы одним архивом ВНИМАНИЕ! прежде, чем задать вопрос, почитайте, где Вы найдете ответы на большинство вопросов: Справочник по NSIS - создан силами нашего сообщества. Руководство пользователя. Перевод – Поляков А.В, зеркало Документация Утилиты разработчика Расширение функциональности Примеры скриптов на нашем форуме Скрипт NSIS для перепаковки AIMP2+Сборки Тема для Notepad++(пример парсинга XML) Достоинства Ещё немного полезной информации: |
|
------- Отправлено: 12:02, 09-12-2012 |
Пользователь Сообщения: 93
|
Профиль | Отправить PM | Цитировать Всем доброго дня.
Тут застрял на такой проблеме, существует ли в NSIS команда, чтобы узнать, находится ли компьютер в домене? Нашел только это https://nsis.sourceforge.io/WmiInspector_plug-in но оно даже не компилится в юникоде. Тест выдает какие то китайские иероглифы. Нужно что нибудь простое, типа "да или нет". Как, например в батнике "wmic.exe ComputerSystem get PartOfDomain" |
Отправлено: 16:02, 07-07-2023 | #2751 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Старожил Сообщения: 352
|
Профиль | Отправить 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
|
Профиль | Отправить PM | Цитировать iglezz, Спасибо. Компа нету чтобы проверить, но буду искать и всё попробую.
|
Отправлено: 23:16, 07-07-2023 | #2753 |
Пользователь Сообщения: 93
|
Профиль | Отправить 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 |
Последний раз редактировалось inco1, 08-07-2023 в 08:17. Отправлено: 07:59, 08-07-2023 | #2754 |
Старожил Сообщения: 352
|
Профиль | Отправить 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 |
Отправлено: 13:44, 08-07-2023 | #2755 |
Пользователь Сообщения: 93
|
Профиль | Отправить 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
|
Профиль | Отправить 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 |
Отправлено: 15:37, 08-07-2023 | #2757 |
Пользователь Сообщения: 93
|
Профиль | Отправить PM | Цитировать |
Отправлено: 09:00, 09-07-2023 | #2758 |
Старожил Сообщения: 352
|
Профиль | Отправить PM | Цитировать inco1,
Для эпизодически встречающихся одиночных инструкций можно написать макрос вроде такого: !define DeleteRegKey3264 `!insertmacro DeleteRegKey3264 ` !macro DeleteRegKey3264 REGROOT REGKEY SetRegView 64 DeleteRegKey ${REGROOT} '${REGKEY}' SetRegView 32 DeleteRegKey ${REGROOT} '${REGKEY}' !macroend Если есть группа ключей, то её можно вынести в макрос и использовать его вместе с SetRegView: |
Отправлено: 12:05, 09-07-2023 | #2759 |
Старожил Сообщения: 169
|
Профиль | Отправить 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> А потом заново записывать эту строку. Проблема со строкой: Она записывается так: И как туда добавить: ума не приложу... |
Отправлено: 14:24, 11-07-2023 | #2760 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Инфо - [ликбез] Помощь начинающим .:[все вопросы]:. часть 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 |
|