PDA

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


Страниц : 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 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170

wolkow70
07-07-2011, 11:44
Прочитал, что еще нужно прописать:

Function .OnInstFailed
UAC::Unload
FunctionEnd

Function .OnInstSuccess
UAC::Unload
FunctionEnd

И сопутствующие функции деинсталляции.

Вот еще проблема, у меня уже есть в скпипте Function .OnInit
Как правильно в этом случае объединить функции?

kotkovets
07-07-2011, 14:36
RequestExecutionLevel user
Этого достаточно, что бы устанавливать программу на Win7 для любого пользователя? »
RequestExecutionLevel - сколько прав необходимо для установки приложения
user - запрашивает права текущего пользователя без административных привилегий.
highest - требует самый высокий уровень выполнения, доступный для текущего пользователя.
admin - требует привелегии администратора.
В справочнике NSIS все это есть
Прочитал, что еще нужно прописать:
Function .OnInstFailed
UAC::Unload
FunctionEnd
Function .OnInstSuccess
UAC::Unload
FunctionEnd »
Эти функции прописывают при классическом фейсе, в MUI они завернуты в другую "обертку". Справочник по NSIS > Оформление > Интерфейс Модем > Стандартные функции
UAC::Unload - выгружает библиотеку из памяти. Значит достаточно, прописать в функции .onGUIEnd - выполняется при закрытии инсталлятора и больше нигде. А по сути сама винда умеет выгружать из памяти библиотеки
Function .onGUIEnd
UAC::Unload
FunctionEnd
Как правильно в этом случае объединить функции? »
это все равно,что объединить пальцы рук с пальцами ног :)
но этот файл остается, не удаляется! »
файл занят скорее всего проводником, можно перезагрузить проводник и удалить, можно удалить при следующей перезагрузки системы.
Delete /REBOOTOK "$APPDATA\Photodex\ProShow Producer\def.dat"

wolkow70
07-07-2011, 15:09
kotkovets,
Хорошо, тогда скажите, что отразить в скрипте, что бы программа без запроса со стороны UAC ставилась с правами администратора? RequestExecutionLevel admin?
UAC.nsh вообще имеет смысл применять? Или я не понял смысла этого плагина.

Есть еще старый макрос IsUserAdmin.nsh

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

это все равно,что объединить пальцы рук с пальцами ног »
Но, ведь, в Function .OnInit часто встречаются комбинации разных функций.. :)

Здесь интересная статейка и полемика на эту тему:
http://sundest.blogspot.com/2007/04/nsis-vista.html

Тут тоже интересно:
http://begemotov.net/creator/shareware/delaem-pravilnuyu-ustanovku-pod-vistoy-c-nsis/


А во вложении оргинальный скрипт VLC в последней редакции с применением UAC

kotkovets
07-07-2011, 16:45
Есть еще старый макрос IsUserAdmin.nsh
А почему он старый? такие же функции апи использует плагин - определяет сколько прав у пользователя. по этому в применении с плагином UAC в скриптах пишут RequestExecutionLevel user - дабы при инсталяции приложения настройки легли в папку юзера с правами админа, т.е настройки, записи в реестр действовали для текущего пользователя не имеющих админских прав.
RequestExecutionLevel admin без плагина, у юзера будет спрошено - что бы он имел такие админские права на установку, если дать права админа юзеру (если он не имеет админских прав), то настройки программы лягут в профиль админа, а не юзера, а если пользователь имеет права админа - то все нормально. примерно так :)

wolkow70
07-07-2011, 17:34
Спасибо.
Тут мучаюсь с удалением ассоциаций на Windows7.
Прописывается:
HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.asf" "Progid" "KMPlayer.asf"

В макросе де-регистрации пишу:

ReadRegStr $0 HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}" "Progid" ""
StrCmp $0 $ClassName 0 +2
DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}" "Progid" ""

Ошибка компиляции в результате...

А в UserChoice все нормально удаляется.

ReadRegStr $0 HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice" ""
StrCmp $0 $ClassName 0 +2
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice"

sawe
07-07-2011, 18:18
Поскольку вы используете только тихий режим Function .OnInstFailed можно не использовать.


Function .OnInstFailed # сообщение при нажатии кнопки Отмена --!
UAC::Unload
FunctionEnd

Function un.onUninstFailed # сообщение при нажатии кнопки Отмена!
UAC::Unload # должен выгрузиться!
FunctionEnd


Но влюбом случае следует обязательно выгружать плагин из памяти UAC::Unload в самом конце, при условии если вы вставили код UAC в начальных функциях:

Function .onInit
и если вставили
Function un.onInit

Если вы его не выгрузите, то в дисптечере задач он останется.

И самое неприятное, существует несколько версий UAC v0.0.11d - v0.2.2d - v0.2.2c и ещё юникоде, которые немного отличаются между собой. Команды и функции те же, но реализация немного другая.
--

wolkow70
07-07-2011, 18:29
Но влюбом случае следует обязательно выгружать плагин из памяти UAC::Unload в самом конце, при условии если вы вставили код UAC в начальных функциях:
Function .onInit
и если вставили
Function un.onInit
Если вы его не выгрузите, то в дисптечере задач он останется. »
Это я реализовал.И самое неприятное, существует несколько версий UAC v0.0.11d - v0.2.2d - v0.2.2c и ещё юникоде, которые немного отличаются между собой. Команды и функции те же, но реализация немного другая. »
Версии с офсайта UAC_v0.2.2d, чего то вообще не компилируются. Показывает инвалидная комманда.
Я выдернул новые файлы из нового комплекта сборки VLC Player. C ними инсталлятор собрался. В чем дело не понятно. При этом в скрипте ничего не менялось. Во вложении модернизированные файлы, версию не знаю.

sawe
07-07-2011, 22:02
Версии с офсайта UAC_v0.2.2d, »

Это пример с UAC_v0.2.2d (http://nsis.sourceforge.net/UAC_plug-in) убрал только все меседжи.

Function .onInit # сообщение в начале установки --!
UAC_Elevate:
UAC::RunElevated
StrCmp 1223 $0 UAC_ElevationAborted ; UAC dialog aborted by user?
StrCmp 0 $0 0 UAC_Err ; Error?
StrCmp 1 $1 0 UAC_Success ;Are we the real deal or just the wrapper?
Quit

UAC_Err:
Abort

UAC_ElevationAborted:
Abort

UAC_Success:
StrCmp 1 $3 +4 ;Admin?
StrCmp 3 $1 0 UAC_ElevationAborted ;Try again?
goto UAC_Elevate
FunctionEnd

;Запуск приложения с правами пользователя для MUI на финальной!
!insertmacro MUI_PAGE_INSTFILES
!define MUI_FINISHPAGE_RUN
!define MUI_FINISHPAGE_RUN_FUNCTION ExecAppFile

Function ExecAppFile
!insertmacro UAC_AsUser_ExecShell 'open' '$INSTDIR\Aimp.exe' '-firstrun' '$INSTDIR' ''
FunctionEnd

; Где угодно!
!insertmacro UAC_AsUser_ExecShell 'open' '$INSTDIR\Aimp.exe' '-firstrun' '$INSTDIR' ''




Это пример для UAC v0.0.11d, но нужно заменить UAC.dll и в инклуды данной версии, 100% рабочий для RequestExecutionLevel user


Function .onInit # сообщение в начале установки --!
UAC::RunElevated
StrCmp 1223 $0 UAC_ElevationAborted # диалог прерванный пользователем --?
StrCmp 0 $0 0 UAC_Err ; ошибка?
StrCmp 1 $1 0 UAC_Success # реально выполнить или только оболочка --?
Quit
UAC_Err:
; MessageBox MB_ICONSTOP "Невозможно поднять права, ошибка $0"
Abort
UAC_ElevationAborted: # повышение было прервано, но все еще выполняется как нормальное --!
UAC_Success:
;--Конец кода UAC --!

; -- далее ваш код --!

FunctionEnd


В чем дело не понятно. »
Я сравнил файлы AptDiff (http://www.aptedit.com/). Похоже на то, что у вас это 0,1 версия.

wolkow70
08-07-2011, 11:29
sawe,
Слелал по вашему варианту с UAC_v0.2.2d.
Не компилируется.

Function: ".OnInit"
Invalid command: UAC::RunElevated
Error in script "D:\NSIS\kmplayer-new.nsi" on line 107 -- aborting creation process
Такое впечатление, что он плагина не видит.

Если добавляю :

Function .OnInstFailed
UAC::Unload ;Must call unload!
FunctionEnd
;
Function .OnInstSuccess
UAC::Unload ;Must call unload!
FunctionEnd

то показывает:

Function: ".OnInstFailed"
Invalid command: UAC::Unload
Error in script "D:\NSIS\kmplayer-new.nsi" on line 95 -- aborting creation process

И еще, что бы это значило (из справки):

This plugin has been tested under the following environments:
Windows 7 - UAC On - Administrator
Windows Vista - UAC On - Administrator
Windows Vista - UAC Off - Administrator
Windows Vista - UAC On - Standard User - User supplies administrator info into the UAC dialog
Windows Vista - UAC On - Standard User - User does not supply administrator info into the UAC dialog
Windows Vista - UAC Off - Standard User - User supplies administrator info into the Run As dialog
Windows Vista - UAC Off - Standard User - User does not supply administrator info into the Run As dialog

kotkovets
08-07-2011, 14:40
wolkow70, подключите хедер UAC.nsh к скрипту (он парсит функции, а не компилятор) и используете макросы из этого хедера.
Для юникодной версии NSIS берем плагин из папки U
Для ANSI версии NSIS берем плагин из папки A
Как определить юникод или анси, скомпильте:
!ifdef NSIS_UNICODE
MessageBox MB_ICONINFORMATION|MB_OK "NSIS_UNICODE" IDOK
!else
MessageBox MB_ICONINFORMATION|MB_OK "NSIS_ANSI" IDOK
!endif

wolkow70
08-07-2011, 15:51
kotkovets, У меня же прописано в скрипте:
RequestExecutionLevel user
!include UAC.nsh
А анси или уникод без разницы, я методом перебора пробовал. Все одно и тоже.

wolkow70
08-07-2011, 16:06
Скомпилил так:

OutFile "test.exe"
!include LogicLib.nsh
Section "test"
!ifdef NSIS_UNICODE
MessageBox MB_ICONINFORMATION|MB_OK "NSIS_UNICODE" IDOK
!else
MessageBox MB_ICONINFORMATION|MB_OK "NSIS_ANSI" IDOK
!endif
SectionEnd

Результат NSIS_ANSI

wolkow70
08-07-2011, 16:43
Похоже на то, что у вас это 0,1 версия »
Вот с ней все собирается. Но хочется современную версию прикрутить...

Может проблема в том, что у меня функция имеет такой вид:

Function .OnInit

UAC_Elevate:
UAC::RunElevated
StrCmp 1223 $0 UAC_ElevationAborted ; UAC dialog aborted by user?
StrCmp 0 $0 0 UAC_Err ; Error?
StrCmp 1 $1 0 UAC_Success ;Are we the real deal or just the wrapper?
Quit

UAC_Err:
; MessageBox mb_iconstop "Unable to elevate, error $0"
Abort

UAC_ElevationAborted:
# elevation was aborted, run as normal?
; MessageBox mb_iconstop "This installer requires admin access, aborting!"
Abort

UAC_Success:
StrCmp 1 $3 +4 ;Admin?
StrCmp 3 $1 0 UAC_ElevationAborted ;Try again?
; MessageBox mb_iconstop "This installer requires admin access, try again"
goto UAC_Elevate
;
;
StrCpy $WindowCaption "${PRODUCT_NAME} ${PRODUCT_VERSION}"
StrCpy $SysDrive $WINDIR 2
StrCpy $GMODE 0
StrCpy $WindowCaption "${PRODUCT_NAME} ${PRODUCT_VERSION}"
${WordReplace} "$EXEFILE" ".exe" ".ini" "+" "$INIFILE"
StrCpy $INIFILE "$EXEDIR\$INIFILE"
${GetOptions} $CMDLINE "/G" $0
${IfNot} ${Silent}
${AndIfNot} ${Errors}
StrCpy $GMODE 1
StrCpy $WindowCaption "Генератор ответов ${PRODUCT_NAME} ${PRODUCT_VERSION}"
IfFileExists "$INIFILE" 0 +2
Delete "$INIFILE"
${EndIf}
FunctionEnd

kotkovets
08-07-2011, 17:30
wolkow70, я же вам писал:
используете макросы из этого хедера »

UAC_Elevate:
--
--

Вы же подключили хедер, но не используете его....))))
т.е вместо UAC_Elevate: нужно !insertmacro UAC_RunElevated
Ну в примере же прописано четко и он работает! а у вас нет...))

wolkow70
08-07-2011, 19:03
Похоже на то, что у вас это 0,1 версия »
Вот с ней все собирается. Но хочется современную версию прикрутить... »
Собраться то собралось, а на практике оказалось не работает. Создал на WinXP SP3 учетную запись без прав админа, и инсталлятор не запустился (показывает ошибку Elevate).

Вы же подключили хедер, но не используете его....)))) »
Я по справке все делал. А там не написано, что надо макросы использовать, а только прописать функцию Function .OnInit , RequestExecutionLevel user и !include UAC.nsh
Ладно, буду макросы раскуривать, может разберусь...

wolkow70
08-07-2011, 19:46
т.е вместо UAC_Elevate: нужно !insertmacro UAC_RunElevated »
Ну, заменил я так. Инсталлятор собрался.
Только, пришлось при этом удалить:

Function .OnInstFailed
UAC::Unload ;Must call unload!
FunctionEnd
;
Function .OnInstSuccess
UAC::Unload ;Must call unload!
FunctionEnd

Так как, показало, что недействительные комманды. А макросов таких я не нашел в хедере.

И еще пришлось удалить

Function ExecAppFile
!insertmacro UAC_AsUser_ExecShell 'open' '$INSTDIR\KMPlayer.exe' '-firstrun' '$INSTDIR' ''
FunctionEnd

!insertmacro UAC_AsUser_ExecShell 'open' '$INSTDIR\KMPlayer.exe' '-firstrun' '$INSTDIR' ''

Так как, вылазила ошибка:

!insertmacro: end of _UAC_IncL
Error: command goto not valid outside Section or Function
Error in macro UAC_AsUser_ExecShell on macroline 2
Error in script "D:\NSIS\kmplayer-new.nsi" on line 99 -- aborting creation process

kotkovets
08-07-2011, 20:08
И еще пришлось удалить
Function ExecAppFile
!insertmacro UAC_AsUser_ExecShell 'open' '$INSTDIR\KMPlayer.exe' '-firstrun' '$INSTDIR' ''
FunctionEnd »
А кто жеж через open открывает исполняемый файл, это для shell-открытия: txt, сайты, линки, ассоцированные файлы с приложениями. Чет вы не с того конца изучаете - вот мучаетесь :closed-to
!insertmacro UAC_AsUser_ExecShell "" "$INSTDIR\KMPlayer.exe" "-firstrun" "$INSTDIR"
и вообще -firstrun - аргумент командной строки
все расписано, а че вы не видите это загадка...

wolkow70
08-07-2011, 20:18
kotkovets,
Если Вы зайдете на страницу

http://nsis.sourceforge.net/UAC_plug-in

то увидите, что я делал все точно так, как там написано.

; !insertmacro UAC_AsUser_ExecShell <Command> <File> <Parameters> <WorkingDir> <ShowWindow>
!insertmacro UAC_AsUser_ExecShell 'open' '$INSTDIR\${APPFILE}' '-firstrun' '$INSTDIR' ''

Where $INSTDIR\${APPFILE} is the path to the file you want to launch.

If you use the MUI skin and have the installer launch the app for you, you will need to do a little more work.
!define MUI_FINISHPAGE_RUN
!define MUI_FINISHPAGE_RUN_FUNCTION ExecAppFile

Function ExecAppFile
!insertmacro UAC_AsUser_ExecShell 'open' '$INSTDIR\${APPFILE}' '-firstrun' '$INSTDIR' ''
FunctionEnd

И все остальное тоже строго по справке делаю, а оно не работает.. И Saw также приводил свой пример, как бы рабочий...

wolkow70
08-07-2011, 20:34
PS.
Так тоже не пашет.
Function: "ExecAppFile"
!insertmacro: UAC_AsUser_ExecShell
!insertmacro: macro "UAC_AsUser_ExecShell" requires 5 parameter(s), passed 4!
Error in script "D:\NSIS\kmplayer-new.nsi" on line 96 -- aborting creation process

sawe
08-07-2011, 21:34
В блоге, на который вы давали ссылку (http://begemotov.net/creator/shareware/delaem-pravilnuyu-ustanovku-pod-vistoy-c-nsis/) на чисто русском языке, буквально на пальцах, объяснены нюансы проблемы с user для UAC плагина.


RequestExecutionLevel user

Section "MainSection" SEC01

SetShellVarContext all

... весь код главной секции

GetFunctionAddress $0 RunFromUser
UAC::ExecCodeSegment $0

SectionEnd

В каждом Zip архиве этого плагина, есть описание и примеры, часть из которых задокументирована под конкретный случай.
Советую вам сначала отложить ваш скрипт и поиграться с примерами UAC, проблемные места выводить в меседж. Также советую (если нету) создать новую учётную запись и под ней отлаживать UAC.

может пригодиться.


UAC::Exec "параметр_или_команда_UAC" "$INSTDIR\Имя.exe" "параметр" "место_выполнения_или_нахождения"

или примерно с ожиданием:

UAC::ExecWait "" "$INSTDIR\Имя.exe" "Readme.txt" "$INSTDIR\XXX"

папка $INSTDIR\XXX - где лежит файл Readme.txt


--




© OSzone.net 2001-2012