|
Внимание, важное сообщение: Дорогие Друзья!
В ноябре далекого 2001 года мы решили создать сайт и форум, которые смогут помочь как начинающим, так и продвинутым пользователям разобраться в операционных системах. В 2004-2006г наш проект был одним из самых крупных ИТ ресурсов в рунете, на пике нас посещало более 300 000 человек в день! Наша документация по службам Windows и автоматической установке помогла огромному количеству пользователей и сисадминов. Мы с уверенностью можем сказать, что внесли большой вклад в развитие ИТ сообщества рунета. Но... время меняются, приоритеты тоже. И, к сожалению, пришло время сказать До встречи! После долгих дискуссий было принято решение закрыть наш проект. 1 августа форум переводится в режим Только чтение, а в начале сентября мы переведем рубильник в положение Выключен Огромное спасибо за эти 24 года, это было незабываемое приключение. Сказать спасибо и поделиться своей историей можно в данной теме. С уважением, ваш призрачный админ, BigMac... |
|
| Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » .: NSIS - все вопросы :. часть 2. |
|
|
.: NSIS - все вопросы :. часть 2.
|
|
Ветеран Сообщения: 1216 |
![]() Данная тема предназначена для обсуждения вопросов, связанных с инсталлятором 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 | |
|