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
06-01-2021, 13:50
Формат вызова неверный »
Я уж попробовал по всякому. :) (и зачем было <rootkey> выделять в отдельный параметр ?)

iglezz
06-01-2021, 15:53
MKN, Оно как-то странно работает или плохо документировано.
Для кодаAccessControl::GetRegKeyGroup "HKCU" "Software\7-Zip\"
Pop $R1
DetailPrint "HKCU:R1: $R1"
Pop $R2
DetailPrint "HKCU:R2: $R2"

AccessControl::GetRegKeyGroup "HKLM" "Software\7-Zip\"
Pop $R1
DetailPrint "HKLM:R1: $R1"
Pop $R2
DetailPrint "HKLM:R2: $R2"
Выдаёт в лог:
HKCU:R1: Software\7-Zip\
HKCU:R2: Cannot look up owner. Error code: 87
HKLM:R1: error
HKLM:R2: Cannot get current ownership. Error code: 2

К тому же у этого плагина не очень с обработкой ошибок, судя по моему непрофессиональному взгляду в исходники.

MKN
06-01-2021, 16:33
iglezz,
Значит этот плагин не годится... ( Придётся пользоваться PS, там с этим всё чётко, ну и можно "прикрутить" к Nsis... )

inco1
08-01-2021, 00:06
Всем привет.
У меня такой вот вопрос. Я, например, извлекаю реальное место установки программы так
ReadRegStr $R9 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\test.exe" "Put"
Все просто, если извлекать только из одного раздела. Это меня устраивает, но....
Можно ли как то прописать, чтобы указать дополнительное извлечения места с другого раздела.
ReadRegStr $R9 HKLM "SOFTWARE\test" "Put"
Параметр "Put"показывает одно и то же место , но вся закавыка, что любой из этих разделов может отсутствовать в реестре.
Нужно взять с первого раздела, а если раздел не найден, то со второго, но обязательно в одну переменную, например $R9. Если один из разделов или оба не найдены, то уведомление об этом не нужно. Как вот такое сотворить?

iglezz
08-01-2021, 00:56
inco1, Нужно просто последовательно читать необходимые значения, с прерыванием последовательности в случае успеха.
В простейшем случае с проверкой на пустое/несуществующее значение: ReadRegStr $R9 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\test.exe" "Put"
StrCmp $R9 "" 0 +4
ReadRegStr $R9 HKLM "SOFTWARE\test" "Put"
StrCmp $R9 "" 0 +2
StrCpy $R9 "X:\путь\"

inco1
08-01-2021, 07:14
iglezz, Спасибо, это то, что нужно. Все просто и работает.

pckassa
10-01-2021, 21:07
...подскажите как сделать так чтобы nsis отсылал запрос на iplogger!?
Хочу получать статистику о запуске моего софта.

Iska
10-01-2021, 23:55
pckassa, коли так — ну, так и делайте сие «в моём софте», а не в инсталляторе.

pckassa
11-01-2021, 10:17
Это рекламная кампания.
Я пускаю траффик и мне нужно отслеживать конверт.
В сам софт я лезть не имею права, да и откровенно говоря я дуб-дубом в коде, элементарный NSIS скрипт Еще могу написать, кое как, но не более...

В общем нужно сделать именно так. Вдруг есть решение, подскажите пожалуйста!

inco1
17-01-2021, 18:35
Всем желаю здравствовать.
У меня опять проблема. Подскажите, ну никак не могу решить. Делаю простейший экзешник, который вносит настройки в некую программу и добавляет в папку с этой программой текстовый документ. Настройки этой программы для каждого конкретного пользователя в реестре в ветке HKEY_CURRENT_USER.
Вот код:

Unicode true
OutFile "test1.exe"
RequestExecutionLevel Admin
SilentInstall silent
SetCompressor /FINAL /SOLID lzma
!include "x64.nsh"
!include "FileFunc.nsh"
Section
WriteRegDWORD HKEY_CURRENT_USER "SOFTWARE\Adobe\Adobe Acrobat\DC\3D" "b3DEnableFlashPlayer" 0x0
SetOutPath "$PROGRAMFILES\\Adobe\Acrobat DC\Acrobat"
File "1.txt"
SectionEnd

Всё работает пока учетка админа. Добавляет настройку и добавляет текстовый файл. Но под простым пользователем это не работает. При запуске просит подтверждения админа и отрабатывает. Вот только эта настройка в реестре добавляется тому самому админу от которого получено разрешение. Текстовый файл в папку добавляется.

Если применить вот такой код:

Unicode true
OutFile "test1.exe"
RequestExecutionLevel user
SilentInstall silent
SetCompressor /FINAL /SOLID lzma
!include "x64.nsh"
!include "FileFunc.nsh"
Section
WriteRegDWORD HKEY_CURRENT_USER "SOFTWARE\Adobe\Adobe Acrobat\DC\3D" "b3DEnableFlashPlayer" 0x0
SetOutPath "$PROGRAMFILES\\Adobe\Acrobat DC\Acrobat"
File "1.txt"
SectionEnd

и просто сделать двойной клик, то запись добавляется правильно, но не добавляется текстовый файл. Если запустить от админа , о и запись настройки добавится админу, текстовый файл добавится.

Что я делаю не так?
В идеале нужно, чтобы запустить экзешник и настройки добавились всем пользователям данного компьютера. Но ничего подобного я нигде не нашел.

iglezz
17-01-2021, 18:58
inco1,
Под какой версией/разрядностью Windows дело происходит?

inco1
17-01-2021, 19:10
iglezz, Доброго вечера.
Испытывал на 10х64. Параметры контроля на низу ползунка.

Добавлено.
Пробовал на 7х64 с двумя пользователями админ и одним простым с включенным контролем ползунок по рекомендации.
Простой пользователь отдаёт настройки реестра программы тому админу от кого получает разрешения.
Как то это не правильно.

iglezz
18-01-2021, 01:37
inco1,
В первом случае всё понятно и правильно - установщик запускается от имени пользователя с админскими привилегиями и CURRENT_USER здесь уже не наш пользователь, запустивший установщик.
Во втором случае тоже всё правильно - нефиг пользователю в системных папках делать, чай не 90-е на дворе :)

Для внесения изменений в реестр сразу всем пользователям можно воспользоваться готовым решением в виде EnumUsersReg.nsh (https://nsis.sourceforge.io/EnumUsersReg)

inco1
18-01-2021, 12:17
iglezz, Спасибо. Это именно то, что я искал. Путем нехитрых подстановок в мой тестовый экзешник получилось следующее:

Unicode true
OutFile "test1.exe"
RequestExecutionLevel Admin
SilentInstall silent
SetCompressor /FINAL /SOLID lzma
!include "x64.nsh"
!include "FileFunc.nsh"
!include "EnumUsersReg.nsh"
Section
${EnumUsersReg} CallbackFunction temp.key
SetOutPath "$PROGRAMFILES\\Adobe\Acrobat DC\Acrobat"
File "1.txt"
SectionEnd
Function CallbackFunction
Pop $0
WriteRegDWORD HKU "$0\SOFTWARE\Adobe\Adobe Acrobat\DC\3D" "b3DEnableFlashPlayer" 0x0
FunctionEnd

Работает так как нужно, но вот компилируется с предупреждением "1 warning: 6020: Uninstaller script code found but WriteUninstaller never used - no uninstaller will be created".
На работу это предупреждение не влияет, но может можно как нибудь его убрать, чтобы совсем по правильному было?

MKN
18-01-2021, 12:30
может можно как нибудь его убрать »
Удали из EnumUsersReg.nsh всё связанное с макросом EnumUsersReg UN

inco1
18-01-2021, 15:17
MKN,
Спасибо. С этим разобрался.

iglezz,
Появилась попутная проблема.
Это работает как надо:
Unicode true
OutFile "test1.exe"
RequestExecutionLevel Admin
SilentInstall silent
SetCompressor /FINAL /SOLID lzma
!include "x64.nsh"
!include "FileFunc.nsh"
!include "EnumUsersReg.nsh"
Section
${EnumUsersReg} CallbackFunction temp.key
SetOutPath "$PROGRAMFILES\\Adobe\Acrobat DC\Acrobat"
File "1.txt"
SectionEnd
Function CallbackFunction
Pop $0
WriteRegDWORD HKU "$0\SOFTWARE\Adobe\Adobe Acrobat\DC\3D" "b3DEnableFlashPlayer" 0x0
FunctionEnd

И это работает как надо:
Unicode true
OutFile "test2.exe"
RequestExecutionLevel Admin
SilentInstall silent
SetCompressor /FINAL /SOLID lzma
!include "ProcessFunc.nsh"
Section
${KillProcess} "P.exe" $0
SectionEnd


Но вот незадача, не работает первое и второе вместе.
Unicode true
OutFile "test3.exe"
RequestExecutionLevel Admin
SilentInstall silent
SetCompressor /FINAL /SOLID lzma
!include "x64.nsh"
!include "FileFunc.nsh"
!include "ProcessFunc.nsh"
!include "EnumUsersReg.nsh"
Section
${KillProcess} "P.exe" $0
SectionEnd
Section
${EnumUsersReg} CallbackFunction temp.key
SetOutPath "$PROGRAMFILES\\Adobe\Acrobat DC\Acrobat"
File "1.txt"
SectionEnd
Function CallbackFunction
Pop $0
WriteRegDWORD HKU "$0\SOFTWARE\Adobe\Adobe Acrobat\DC\3D" "b3DEnableFlashPlayer" 0x0
FunctionEnd

При компиляции ошибка !include "EnumUsersReg.nsh" или !include "ProcessFunc.nsh" , в зависимости, что первой объявить.

!include "EnumUsersReg.nsh" и !include "ProcessFunc.nsh" не совместимы? Или я что то не так слепил?

iglezz
18-01-2021, 15:32
inco1, Причина ошибок - одинаковые !define
По хорошему надо и в EnumUsersReg.nsh и в ProcessFunc.nsh добавить
!include Win\WinNT.nsh
и удалить дефайны, совпадающие во всех трёх файлах

Iska
18-01-2021, 17:18
iglezz, а разве в NSIS не пользуют какие-нибудь !IFNOTDEFINE и т.п.?

iglezz
18-01-2021, 17:29
Iska, это можно, но на перспективу лучше не плодить сущности..

iglezz
18-01-2021, 18:05
inco1, Модифицированные EnumUsersReg.nsh (https://raw.githubusercontent.com/iglezz/NSIS-related-things/master/EnumUsersReg.nsh) и ProcessFunc.nsh (https://raw.githubusercontent.com/iglezz/NSIS-related-things/master/ProcessFunc.nsh), которые не конфликтуют.




© OSzone.net 2001-2012