Показать полную графическую версию : [архив].: NSIS - все вопросы :.
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"
Поскольку вы используете только тихий режим 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 ними инсталлятор собрался. В чем дело не понятно. При этом в скрипте ничего не менялось. Во вложении модернизированные файлы, версию не знаю.
Версии с офсайта 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
В блоге, на который вы давали ссылку (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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC