PDA

Показать полную графическую версию : .: NSIS - все вопросы :. часть 2.


Страниц : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 [59] 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146

MKN
28-04-2014, 11:19
А как однозначно проверить входит ПК в домен или нет, и вывести MessageBox: »
Попробуй так :
outfile GetComputerNameEx_test.exe
; http://msdn.microsoft.com/en-us/library/ms724301.aspx
Section
System::Call 'kernel32.dll::GetComputerNameExA(i 4, t .r0,*i ${NSIS_MAX_STRLEN} r1)i.r2'
MessageBox MB_OK "$0"

;will get you in $0 the ComputerNamePhysicalNetBIOS. Or just follow the enumeration:

; ComputerNameNetBIOS 0
; ComputerNameDnsHostname 1
; ComputerNameDnsDomain 2
; ComputerNameDnsFullyQualified 3
; ComputerNamePhysicalNetBIOS 4
; ComputerNamePhysicalDnsHostname 5
; ComputerNamePhysicalDnsDomain 6
; ComputerNamePhysicalDnsFullyQualified 7
SectionEnd


в функцию подставляем циферку , нужную для конкретной задачи...

ps Ранее я ещё приводил пример :

Функция NetWkstaGetInfo возвращает информацию о конфигурации рабочей станции (имени домена, локального компьютера, информацию о OC)
http://msdn.microsoft.com/en-us/library/windows/desktop/aa370663(v=vs.85).aspx


Outfile "NetWkstaGetInfo_test.exe"

Section
System::Call "netapi32::NetWkstaGetInfo(i0, i100, *i r0 r0) i.r6"
System::Call "*$0(i.r1, w.r2, w.r3, i.r4, i.r5)"
MessageBox MB_OK "$2 $3 domain (platform_id $1 - ver $4.$5) "
System::Call "netapi32::NetApiBufferFree(*i r0) i.r6"
; 500 - The Windows NT platform * http://msdn.microsoft.com/en-us/library/windows/desktop/aa371402(v=vs.85).aspx
SectionEnd

silione
28-04-2014, 12:17
Давно не следил за темой и извиняюсь заранее если такой вопрос уже обсуждался.

После выхода новой версии появилась ли возможность создавать пакеты размером больше 2Gb или NSIS все еще на это не способна?

MKN
28-04-2014, 12:37
появилась ли возможность создавать пакеты размером больше 2Gb »

судя по последним обсуждениям этого вопроса - нет... http://forums.winamp.com/showthread.php?t=376132
Хотя в то же время в анонсе : Installers can be as large as 2GB http://www.filehorse.com/download-nsis/
Только, по моему, создавать такие огромные NSIS инсталляторы - верх извращения. Почему бы не манипулировать из скрипта , отдельным архивом любого типа и размера ? И практично и удобно...

MKN
30-04-2014, 13:14
Иногда после запуска-закрытия приложения, остаётся висеть его процесс или даже появляются несколько его одинаковых дублей-процессов ( после нескольких запусков-закрытий ).
Причины такого размножения в данном моменте не столь существенны, но надо закрыть-убить ВСЕ эти возникшие процессы, количество которых заранее не известно и не предсказуемо. Каким образом это лучше сделать в NSIS ?
Например, вижу в диспетчере задач - 10 процессов App.exe. Хочу запустить скрипт, убивающий на раз всю эту ораву клонов...

Begin2Fly
30-04-2014, 13:41
Иногда после запуска-закрытия приложения, остаётся висеть его процесс или даже появляются несколько его одинаковых дублей-процессов ( после нескольких запусков-закрытий ).
Причины такого размножения в данном моменте не столь существенны, но надо закрыть-убить ВСЕ эти возникшие процессы, количество которых заранее не известно и не предсказуемо. Каким образом это лучше сделать в NSIS ?
Например, вижу в диспетчере задач - 10 процессов App.exe. Хочу запустить скрипт, убивающий на раз всю эту ораву клонов... »

!include "nsProcess.nsh"

loop:
${nsProcess::FindProcess} "App.exe" $R0
StrCmp $R0 0 0 +4
${nsProcess::KillProcess} "App.exe" $R0
Sleep 100
Goto loop
Циклом?

MKN
30-04-2014, 16:25
Циклом? »
Цикл напрашивается само собой... Только в ситуации, когда при запущенном App.exe , погасив один процессс возникает тут же следующий - сработает ли цикл ? Надо проверить...
(В моём случае, прога постоянно запускает процесс модуля соединения с интернетом, при его отсутствии - не успеваю закрывать процессы. Потому и нужен технологический скрипт "убийства" этого безобразия )

K.A.V.
30-04-2014, 16:34
MKN, тебя как-будто подменили, ей богу, сначала о вопросе, который есть в справочнике (Примеры кодов => Работа с процессами), а теперь ещё и это :)

при запущенном App.exe, который в свою очередь генерит бесконечно дубли, сработает ли цикл ? »
В чем проблема в oninit прописать самопроверку? По процессу/мютексу (уже обсуждалось) и просто прекращать запуск...С NSIS ты вроде не первый день работаешь, думаю код набросаешь сам ;)

MKN
30-04-2014, 16:52
По процессу/мютексу (уже обсуждалось) и просто прекращать запуск... »
Вот не пришло в голову и всё... :)
С NSIS ты вроде не первый день работаешь »
Действительно, одно дело работать, другое чаще в справочник заглядывать... :) Слишком много всего вокруг, причём одновременно. Времени вот только мало...

BuZzOFF
06-05-2014, 09:57
подправил winver2.nsh (http://yadi.sk/d/zSPySGWfCkC4m)»
Как скачать? Пишет: "Nothing found".
http://s1.directupload.net/images/140506/79eekuut.png

Begin2Fly
06-05-2014, 10:19
BuZzOFF, http://rghost.ru/54979826

kotkovets
06-05-2014, 15:21
Добавил в шапку: Определение всех ОС WINDOWS (winver2.nsh) >> Расширение функциональности

Limonica
07-05-2014, 21:25
Задача, вывести MessageBox "WinName" - "WinType" или "WinServerName" если эта серверная ОС, в примере неправильный вывод, где то нарушена логика, прошу совета.

!include "WinVer2.nsh"
OutFile "WinGetVerInfo.exe"
Caption WinGetVerInfo

Function .OnInit
${WinName} $3
${WinType} $4
StrCmp $4 "" 0 +3
MessageBox MB_OK "$4"
${WinServerName} $4

MessageBox MB_OK "Win = $3 $4"
Quit
FunctionEnd

Section
SectionEnd

K.A.V.
07-05-2014, 22:00
Задача, вывести MessageBox "WinName" - "WinType" или "WinServerName" если эта серверная ОС »

Function .OnInit
${WinName} $3
${WinType} $4
${WinServerName} $5
StrCmp $5 "" +2 0
MessageBox MB_OK|MB_ICONINFORMATION "Серверная ОС: $5" idok +2
MessageBox MB_OK "Win = $3 ($4)"
Quit
FunctionEnd

Limonica
08-05-2014, 13:41
Спасибо за пример, при дальнейшем копании выяснилось, что winver2.nsh конфликтует с nsExec плагином:
!include "WinVer2.nsh"
OutFile "WinGetVerInfo.exe"
Caption WinGetVerInfo

Function .OnInit

nsExec::exec 'calc.exe'

${WinName} $3
${WinType} $4
${WinServerName} $5

MessageBox MB_OK "$3 $4$5"

FunctionEnd

Section
SectionEnd

В вывод добавляется 0, можно как то это дело исправить?

---------------------------
WinGetVerInfo
---------------------------
WinXP Professional0
---------------------------
OK
---------------------------

---------------------------
WinGetVerInfo
---------------------------
Server 2012 R2 0Server Standard
---------------------------
ОК
---------------------------

K.A.V.
08-05-2014, 13:56
В вывод добавляется 0, можно как то это дело исправить? »
Так удалите с конца 1 символ в строке командой StrCpy (описание есть в справочнике) :)

Либо просто определяйте ОС до выполнения команды с плагином, на переменные вы не жадный же? ;)

Function .OnInit
${WinName} $3
${WinType} $4
${WinServerName} $5

nsExec::exec 'calc.exe'

MessageBox MB_OK "$3 $4$5"

FunctionEnd

kotkovets
08-05-2014, 16:32
Спасибо за пример, при дальнейшем копании выяснилось, что winver2.nsh конфликтует с nsExec плагином »
НЕ конфликтует, плагин оставляет после себя в стеке код возврата, поэтому нужно извлекать код и "очищать"
в доках пишут то так:
nsExec::exec 'calc.exe'
pop $0

Flix
12-05-2014, 12:41
NSIS v3.0 перешла из стадии альфа в стадию бета. Новости здесь (http://sourceforge.net/p/nsis/news/?source=navbar). Загрузить релиз можно с оффсайта (http://nsis.sourceforge.net/Download). Отчеты об ошибках сообщаем на форум NSIS (http://forums.winamp.com/showthread.php?t=377430).

K.A.V.
12-05-2014, 13:23
NSIS v3.0 перешла из стадии альфа в стадию бета »
Отлично, значит проект реально проснулся, как и наш справочник :)

Поставил, будем обкатывать, пока что после первых компиляций заметил уменьшение размера всех выходных файлов по сравнению с 3.0a1
В Release notes как-то мало инфы по мелким изменениям даже, как-будто ничего не делали

MKN
17-05-2014, 11:57
Расшарить папку и задать права доступа можно с помощью такого кода :


;создать общий ресурс с полным доступом для всех

outfile "NetShareAdd.exe"
!include "LogicLib.nsh"

# Definitions and user flags
!define STYPE_DISKTREE 0
!define ACCESS_READ 0x01
!define ACCESS_WRITE 0x02
!define ACCESS_CREATE 0x04
!define ACCESS_EXEC 0x08
!define ACCESS_DELETE 0x10
!define ACCESS_ATRIB 0x20
!define ACCESS_PERM 0x40
!define ACCESS_ALL 0x7F

# Permissions
!define GENERIC_READ 0x80000000
!define GENERIC_WRITE 0x40000000
!define GENERIC_EXECUTE 0x20000000
!define GENERIC_ALL 0x10000000
!define NO_INHERITANCE 0x0
!define SECURITY_DESCRIPTOR_REVISION 1

# ACCESS_MODE values
!define NOT_USED_ACCESS 0
!define GRANT_ACCESS 1
!define SET_ACCESS 2
!define DENY_ACCESS 3
!define REVOKE_ACCESS 4
!define SET_AUDIT_SUCCESS 5
!define SET_AUDIT_FAILURE 6

# MULTIPLE_TRUSTEE_OPERATION values
!define NO_MULTIPLE_TRUSTEE 0
!define TRUSTEE_IS_IMPERSONATE 1

# TRUSTEE_FORM values
!define TRUSTEE_IS_SID 0
!define TRUSTEE_IS_NAME 1
!define TRUSTEE_BAD_FORM 2
!define TRUSTEE_IS_OBJECTS_AND_SID 3
!define TRUSTEE_IS_OBJECTS_AND_NAME 4

# TRUSTEE_TYPE values
!define TRUSTEE_IS_UNKNOWN 0
!define TRUSTEE_IS_USER 1
!define TRUSTEE_IS_GROUP 2
!define TRUSTEE_IS_DOMAIN 3
!define TRUSTEE_IS_ALIAS 4
!define TRUSTEE_IS_WELL_KNOWN_GROUP 5
!define TRUSTEE_IS_DELETED 6
!define TRUSTEE_IS_INVALID 7
!define TRUSTEE_IS_COMPUTER 8

# Structure Definitions
!define strSHARE_INFO_2 '(w,i,w,i,i,i,w,w)i' ;This can be done with the above code by using the SHARE_INFO_2 structure.
!define strSHARE_INFO_502 '(w,i,w,i,i,i,w,w,i,i)i'
!define strEXPLICIT_ACCESS '(i,i,i,i,i,i,i,i)i'

!macro CreateNewFullShare SHARENAME SHARE_TYPE SHARE_COMMENT SHARE_PERMISSIONS MAX_USERS CURRENT_USES SHARE_PATH SHARE_PASS
System::Call /NOUNLOAD '*${strSHARE_INFO_2}("${SHARENAME}",${SHARE_TYPE},"${SHARE_COMMENT}",${SHARE_PERMISSIONS},${MAX_USERS},${CURRENT_USES},"${SHARE_PATH}","${SHARE_PASS}")i.R0'
System::Call /NOUNLOAD 'netapi32::NetShareAdd(, i 2, i R0, *i .R1) i .r1'
${If} $1 <> 0
MessageBox MB_OK|MB_ICONSTOP|MB_TOPMOST 'There was an error creating the share!'
${EndIf}
System::Free $R0
!macroend

Section
;!insertmacro CreateNewFullShare "Share Name" ${STYPE_DISKTREE} "Share Description" 0 -1 0 "X:\<folder_to_share>" ""
!insertmacro CreateNewFullShare "Temp" ${STYPE_DISKTREE} "Share Description" 0 -1 0 "C:\Temp" ""
SectionEnd

Кроме основного назначения пригодится, например, для админ установки/распаковки MSI пакетов, требующих сетевой путь (продукты ABBYY и др. )

Удалить шару :


outfile "NetShareDel.exe"
!include "LogicLib.nsh"

!macro RemoveShare SHARENAME
System::Call /NOUNLOAD 'netapi32::NetShareDel(, w "${SHARENAME}",i 0) i .r1'
${If} $1 <> 0
MessageBox MB_OK|MB_ICONSTOP|MB_TOPMOST 'There was an error removing the share!"'
${EndIf}
!macroend

Section
;!insertmacro RemoveShare "ShareName"
!insertmacro RemoveShare "Temp"
SectionEnd


Работает на Win XP и Win 7 (на 8 не проверял)

Awral
21-05-2014, 00:42
Как запустить ExecWait в режиме SILENT?




© OSzone.net 2001-2012