PDA

Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 9]


Страниц : 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

Iska
23-01-2019, 08:07
И больше на Windows 10 мало вероятно что предвидится. »
4.7 PowerShell Core 6.0 (https://en.wikipedia.org/wiki/PowerShell#PowerShell_Core_6.0)

ErikPshat
23-01-2019, 09:00
Iska, ну допустим, пусть будет даже и так. Это ядро пока ещё не зарелизено на оффсайте, там давно уже лежит версия 5.1 и она давно не обновляется. Но разве это на что-то влияет? Предположим программе требуется для её стабильной работы версия 5.1, не меньше, но конечно же можно старше и если у юзера установлена меньшая версия, тогда ему предлагается обновиться как минимум на требуемую 5.1. И что это меняет, для работы моей программы, даже если завтра выйдет PS 6,0, потом 7.0 и так далее? Но они же будут не меньше 5.1, а если у юзера установлена более свежая версия, тогда логично ему и не будет предлагаться скачать и установить 5.1.

Ну я так понял, это просто опровержение моих слов типа "мало вероятно что предвидится" :)

El Sanchez
23-01-2019, 10:44
Я пытаюсь прочитать это и как-то загадочно это. Предположим у пользователя (у меня) установлена последняя версия PowerShell 5.1, тогда читаю:
"Если не 5.1.14409.1005 (возвращает PSVersion из реестра) или 0.0.14409.1005 < 0 тогда... begin" и у меня пошла скачка и установка, даже если мне это не надо. »
ErikPshat, немного я протупил, все-таки там 5.1 должно стоять. Главное, сначала правильно написал, потом переклинило и на 5.2 исправил :).
Первое условие из реестра получается никогда не выполняется, а служит только для доставания ключа из реестра в переменную PSVersion?
Вторым условием производится сравнение версии из реестра с требуемой нами. Но тогда и оно не отрабатывает, тем более, если оставить там 5.2. »
ErikPshat, если не прочитали версию, то сравнивать нечего, нет у нас PowerShell, выполняем блок. Если прочитали, то сравниваем то, что прочитали, по результату проверки выполняем блок. Также в блоке пропишите сообщение, когда PowerShell не установлен (выпонилось первое условие).
По-моему, моя прежняя конструкция вполне прозрачна (для меня) и отрабатывает правильно, даже если завтра выйдет версия 10. »
ErikPshat, отлично, выходит 10.0.0.1, вы с Copy режете до 3 символов, теперь сравните строки '10.' < '5.1'. Ой.

Iska
23-01-2019, 17:19
ErikPshat, мы уже поимели версию ОС Windows за номером 10.0 сразу после версии 6.3. Так что не зарекайтесь.

ErikPshat
23-01-2019, 19:39
El Sanchez, ещё раз благодарю за помощь и разъяснения! Потихоньку кое-что проясняется.

Есть ещё один один момент, который я оказывается упустил. Дело в том, что на Windows Vista идёт версия PS 1.0, на Windows 7 идёт из коробки версия PS 2.0 и что самое важное, они прописываются по другому пути в реестре, там разница в цифре 1 в пути:
SOFTWARE\Microsoft\PowerShell\1\PowerShellEngine
А, начиная с Windows 8.0 PS 3.0 в пути вместо 1 идёт 3. Получается, что на 7-ке будет возвращаться пустая строка, как и в Vista (но ей пристального внимания уже не уделяем).
Тогда получается, нужно добавить условие проверки ключа реестра под 7-ку. Правильно ли будет, если я сделаю так:
if not RegQueryStringValue(HKLM,'SOFTWARE\Microsoft\PowerShell\1\PowerShellEngine','PowerShellVersion',PSVe rsion) or
not RegQueryStringValue(HKLM,'SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine','PowerShellVersion',PSVe rsion) or
(StrCmpLogicalW(PSVersion, '5.1') < 0) then
Либо можно соорудить другую конструкцию через if и else, т.е. провести по отдельности верификацию через первый ключ, в противном случае через второй.

ErikPshat, мы уже поимели версию ОС Windows за номером 10.0 сразу после версии 6.3. »ErikPshat, отлично, выходит 10.0.0.1, вы с Copy режете до 3 символов, теперь сравните строки '10.' < '5.1'. Ой. »
Предположим, выйдет версия 10.0123.456, через Copy мы отсекаем первые 3 символа, получится 10. (десять с точкой).
Тогда при сравнении 10. < 5.1 разве система не поймёт, что нужно сравнивать цифры до точки, а потом после точки. Если стоит точка, тогда думаю система должна определять, что это дробная запятая и, если после точки ничего не стоит, то это означает 0, т.е. 10.0 < 5.1. Это конечно можно проверить на практике, но пока это так, размышления и аналитическая деятельность.

Iska
23-01-2019, 20:09
Это конечно можно проверить на практике, но пока это так, размышления и аналитическая деятельность. »
Проверяю:
AutoItSetOption("MustDeclareVars", 1)

ConsoleWrite( _
"Returns 0 if the strings are identical." & @CRLF & _
"Returns 1 if the string pointed to by psz1 has a greater value than that pointed to by psz2." & @CRLF & _
"Returns -1 if the string pointed to by psz1 has a lesser value than that pointed to by psz2." & @CRLF & @CRLF _
)


ConsoleWrite("1 w/s 5 ==> " & String(_StrCmpLogicalW("1", "5" )) & @CRLF)
ConsoleWrite("1 w/s 5.0 ==> " & String(_StrCmpLogicalW("1", "5.0")) & @CRLF)
ConsoleWrite("1.0 w/s 5 ==> " & String(_StrCmpLogicalW("1.0", "5" )) & @CRLF)
ConsoleWrite("1.0 w/s 5.0 ==> " & String(_StrCmpLogicalW("1.0", "5.0")) & @CRLF)

ConsoleWrite(@CRLF)

ConsoleWrite("10 w/s 5 ==> " & String(_StrCmpLogicalW("10", "5" )) & @CRLF)
ConsoleWrite("10 w/s 5.0 ==> " & String(_StrCmpLogicalW("10", "5.0")) & @CRLF)
ConsoleWrite("10.0 w/s 5 ==> " & String(_StrCmpLogicalW("10.0", "5" )) & @CRLF)
ConsoleWrite("10.0 w/s 5.0 ==> " & String(_StrCmpLogicalW("10.0", "5.0")) & @CRLF)

ConsoleWrite(@CRLF)

ConsoleWrite("10 w/s 10 ==> " & String(_StrCmpLogicalW("10", "10" )) & @CRLF)
ConsoleWrite("10 w/s 10.0 ==> " & String(_StrCmpLogicalW("10", "10.0")) & @CRLF)
ConsoleWrite("10.0 w/s 10 ==> " & String(_StrCmpLogicalW("10.0", "10" )) & @CRLF)
ConsoleWrite("10.0 w/s 10.0 ==> " & String(_StrCmpLogicalW("10.0", "10.0")) & @CRLF)

Exit(0)

Func _StrCmpLogicalW($s1, $s2)
Return DllCall('shlwapi.dll', 'int', 'StrCmpLogicalW', 'wstr', $s1, 'wstr', $s2)[0]
EndFunc

Returns 0 if the strings are identical.
Returns 1 if the string pointed to by psz1 has a greater value than that pointed to by psz2.
Returns -1 if the string pointed to by psz1 has a lesser value than that pointed to by psz2.

1 w/s 5 ==> -1
1 w/s 5.0 ==> -1
1.0 w/s 5 ==> -1
1.0 w/s 5.0 ==> -1

10 w/s 5 ==> 1
10 w/s 5.0 ==> 1
10.0 w/s 5 ==> 1
10.0 w/s 5.0 ==> 1

10 w/s 10 ==> 0
10 w/s 10.0 ==> -1
10.0 w/s 10 ==> 1
10.0 w/s 10.0 ==> 0

Отдельное внимание на последнюю группу.

El Sanchez
23-01-2019, 21:42
огда получается, нужно добавить условие проверки ключа реестра под 7-ку. Правильно ли будет, если я сделаю так: »
ErikPshat, нет. Вы проверяете наличие PS 5.0, так что чтение из PowerShell\1 бессмысленно.
Тогда при сравнении 10. < 5.1 разве система не поймёт, что нужно сравнивать цифры до точки, а потом после точки. »
ErikPshat, нет. Строковые литералы сравниваются посимвольно и сравнение закончится на первом символе, т.к. '1' < '5'.
10 w/s 10.0 ==> -1
10.0 w/s 10 ==> 1 »
Iska, хе-хе, об этом надо помнить. Кстати, StrCmpLogicalW еще и -2 возвращает, если какой-либо параметр пуст.

ErikPshat
24-01-2019, 00:26
Iska, El Sanchez, ага, спасибо! Понятно, значит идёт посимвольное сравнение как текст, а не как цифры.

Да, я это на практике проверил, поменял в реестре версию PS, просто добавил 1 спереди, получилось 15.1 )))
Оказывается для 64-битки путь автоматически в реестре меняется на Wow6432Node:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\PowerShell\3\PowerShellEngine

И вывел через MsgBox версию, чтобы воочию убедиться верно ли возвращает:

https://i4.imageban.ru/out/2019/01/24/a182c5ca7c98bb2895db3e19dd1ebe66.png

Ну и далее пошло скачивание и установка, т.е. условие сравнения не выполнилось правильно. То есть, вы правы, сравнение идёт посимвольно и никакие точки, запятые, дроби тут не учитываются. Ещё нашёл функцию в Inno Preprocessor - DecodeVer и EncodeVer, но не понял, почему она не задействуется сразу, хотя вроде бы функция объявлена изначально по умолчанию.

Iska
24-01-2019, 06:51
Кстати, StrCmpLogicalW еще и -2 возвращает, если какой-либо параметр пуст. »
Что ж они, заразы, не пишут об том?

Но зато пишут не менее интересное:
Note Behavior of this function, and therefore the results it returns, can change from release to release. It should not be used for canonical sorting applications.
:lol:.

Оказывается для 64-битки путь автоматически в реестре меняется на Wow6432Node: »
Да нет. Это только если Ваше приложение — x86 под x64 ОС. А так раздел HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell вполне себе существует под x64 ОС. У меня, например, под Windows 7 SP1 x64 он выглядит так:
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell]
"DisablePromptToUpdateHelp"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1]
"Install"=dword:00000001
"PID"="89383-100-0001260-04309"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\0409]
"Install"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\PowerShellEngine]
"ApplicationBase"="C:\\Windows\\System32\\WindowsPowerShell\\v1.0"
"PSCompatibleVersion"="1.0, 2.0"
"RuntimeVersion"="v2.0.50727"
"ConsoleHostAssemblyName"="Microsoft.PowerShell.ConsoleHost, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, ProcessorArchitecture=msil"
"ConsoleHostModuleName"="C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\Microsoft.PowerShell.ConsoleHost.dll"
"PowerShellVersion"="2.0"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\PSConfigurationProviders]

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\PSConfigurationProviders\Microsoft.PowerShell]
"ApplicationBase"="C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\"
"AssemblyName"="System.Management.Automation, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, ProcessorArchitecture=msil"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds]

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell]
"Path"="C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe"
"ExecutionPolicy"="RemoteSigned"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\ScriptedDiagnostics]
"ExecutionPolicy"="Unrestricted"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\3]
"ConsoleHostShortcutTargetX86"=hex(2):25,00,50,00,72,00,6f,00,67,00,72,00,61,\
00,6d,00,44,00,61,00,74,00,61,00,25,00,5c,00,4d,00,69,00,63,00,72,00,6f,00,\
73,00,6f,00,66,00,74,00,5c,00,57,00,69,00,6e,00,64,00,6f,00,77,00,73,00,5c,\
00,53,00,74,00,61,00,72,00,74,00,20,00,4d,00,65,00,6e,00,75,00,5c,00,50,00,\
72,00,6f,00,67,00,72,00,61,00,6d,00,73,00,5c,00,41,00,63,00,63,00,65,00,73,\
00,73,00,6f,00,72,00,69,00,65,00,73,00,5c,00,57,00,69,00,6e,00,64,00,6f,00,\
77,00,73,00,20,00,50,00,6f,00,77,00,65,00,72,00,53,00,68,00,65,00,6c,00,6c,\
00,5c,00,57,00,69,00,6e,00,64,00,6f,00,77,00,73,00,20,00,50,00,6f,00,77,00,\
65,00,72,00,53,00,68,00,65,00,6c,00,6c,00,20,00,28,00,78,00,38,00,36,00,29,\
00,2e,00,6c,00,6e,00,6b,00,00,00
"ConsoleHostShortcutTarget"=hex(2):25,00,50,00,72,00,6f,00,67,00,72,00,61,00,\
6d,00,44,00,61,00,74,00,61,00,25,00,5c,00,4d,00,69,00,63,00,72,00,6f,00,73,\
00,6f,00,66,00,74,00,5c,00,57,00,69,00,6e,00,64,00,6f,00,77,00,73,00,5c,00,\
53,00,74,00,61,00,72,00,74,00,20,00,4d,00,65,00,6e,00,75,00,5c,00,50,00,72,\
00,6f,00,67,00,72,00,61,00,6d,00,73,00,5c,00,41,00,63,00,63,00,65,00,73,00,\
73,00,6f,00,72,00,69,00,65,00,73,00,5c,00,57,00,69,00,6e,00,64,00,6f,00,77,\
00,73,00,20,00,50,00,6f,00,77,00,65,00,72,00,53,00,68,00,65,00,6c,00,6c,00,\
5c,00,57,00,69,00,6e,00,64,00,6f,00,77,00,73,00,20,00,50,00,6f,00,77,00,65,\
00,72,00,53,00,68,00,65,00,6c,00,6c,00,2e,00,6c,00,6e,00,6b,00,00,00
"Install"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\3\0409]
"Install"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine]
"ApplicationBase"="C:\\Windows\\System32\\WindowsPowerShell\\v1.0"
"PSPluginWkrModuleName"="C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\system.management.automation.dll"
"PSCompatibleVersion"="1.0, 2.0, 3.0, 4.0, 5.0, 5.1"
"RuntimeVersion"="v4.0.30319"
"ConsoleHostAssemblyName"="Microsoft.PowerShell.ConsoleHost, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, ProcessorArchitecture=msil"
"ConsoleHostModuleName"="C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\Microsoft.PowerShell.ConsoleHost.dll"
"PowerShellVersion"="5.1.14409.1005"

ErikPshat
24-01-2019, 08:11
Iska, ну да, у меня то же самое. Просто я говорю о том, что по обычному пути поменял версию PowerShell, потом удивился, что как на скриншоте выше версия не изменилась. Сначала не понял, что за фокусы, подумал, может быть изменения не применились, перезагрузился, снова скомпилировал и опять показывает мне ответ 5.1, хотя я поменял на 15.1 ))) Потом вспомнил об этой ветке реестра, полез туда и там поменял, тогда оно и показалось во всей красе. Ну это я просто так написал, вдруг кому по ходу дела пригодится. Правда, чтобы сменить версию PS в реестре, пришлось себя владельцем ветки сделать, а потом и права выдать :D.

Iska
24-01-2019, 19:23
Правда, чтобы сменить версию PS в реестре, пришлось себя владельцем ветки сделать, а потом и права выдать :D. »
ErikPshat, обзаведитесь Far Manager'ом (и одним-двумя плагинами под него для работы с реестром) — и Вам никогда больше не придётся таким заниматься.

1specific
25-01-2019, 14:05
Всем привет.
Ищу человека который отлично ладит с inno setup.
Задача: сделать стучалку на сервер при установке программы, чтобы можно было подсчитать количество уникальных установок (подсчет уже на уровне сервера и к задаче не имеет отношения). Более подробно писал об этом в этом (http://forum.oszone.net/post-2853866-219.html) посте.
Разумеется "не за спасибо".
Пишите в ЛС. Договоримся!

Iska
25-01-2019, 17:59
Ищу человека который отлично ладит с inno setup. »
El Sanchez, беритесь.

El Sanchez
25-01-2019, 20:47
El Sanchez, беритесь. »
Iska, вменяемого ТЗ нет, показания меняются. Мне страшно. :)

Задача: сделать стучалку на сервер при установке программы, чтобы можно было подсчитать количество уникальных установок (подсчет уже на уровне сервера и к задаче не имеет отношения) »
1specific, я уже спрашивал про "успешная установка", теперь пришла очередь спросить про "уникальных скачиваний" и "уникальных установок". Что считаем? Количество скачиваний <> количество установок. Скачивания считать бессмысленно, можно скачать установщик 1000 раз и ни разу ничего не поставить. Значит, установки. Чтобы посчитать количество уникальных установок, нужно дать определение уникальной установке. Считать ли установку уникальной, если делается второй раз в другую папку установки, нежели первая? А установка на другой физический диск уникальна?

TROY Diamond
25-01-2019, 22:37
вы не знаете размер будущих архивов, поэтому DiskSpaceLabel-у вам нечего предложить.

El Sanchez, а если я знаю, размер будущих архивов, хотя бы примерно, либо если нужен конкретный размер свободного места, например 15 ГБ, вполне хватит, это лучше чем 20-25, сколько хочет установщик с учётом распакованных архивов!

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

Так и какое же решение использовать китайскую версию или продолжать корректировать манифест у готового (скомпилированного) setup.exe?

Мне принципиально нужно чтобы установщик запускался и требовал права Администратора, а тех пользователей у которых нет прав Администратора или которые не хотят запускать с правами Админа установщик - обойдутся! (есть такие даже в 2019 году ещё) странно, - да, что программе которая копирует свои файлы в системные папки, и/или регистрирует какие-то библиотеки, делает записи в реестре - нужны права Администратора? )))

1specific
26-01-2019, 00:49
1specific, я уже спрашивал про "успешная установка", теперь пришла очередь спросить про "уникальных скачиваний" и "уникальных установок". Что считаем? Количество скачиваний <> количество установок. Скачивания считать бессмысленно, можно скачать установщик 1000 раз и ни разу ничего не поставить. Значит, установки. Чтобы посчитать количество уникальных установок, нужно дать определение уникальной установке. Считать ли установку уникальной, если делается второй раз в другую папку установки, нежели первая? А установка на другой физический диск уникальна? »
El Sanchez, Я уже косвенно отвечал в других постах на этот вопрос, в общем то уникальная установка = уникальный компьютер.
Разумеется скачивания и запуски установщика считать бессмысленно. Поэтому нужно считать только успешные установки. И после успешной установки выполнять сценарий отправки на сервер hwid пользователя (как идентификатор уникальной железяки = уникальной установки) и md5 установщика (как идентификатор реферала).
Знаю что md5 вариант не самый лучший. Но я исхожу из того, что просто не смогу физически создать и содержать для каждого партнера отдельный установщик, и обновлять его при необходимости. А вот md5 могу генерировать сервером и записывать в базу перед тем как отдать файл на скачивание, практически на лету.

Дополнительным преимуществом защиты от накрутки может быть отправка и других данных, например версия OS, локальная дата и время установки и т.п. - тут уже лучше с вами (исполнителем) пообщаться на эту тему лично.

Если будут еще вопросы - с радостью отвечу.

El Sanchez
26-01-2019, 20:14
а если я знаю, размер будущих архивов, хотя бы примерно, либо если нужен конкретный размер свободного места, например 15 ГБ, вполне хватит, это лучше чем 20-25, сколько хочет установщик с учётом распакованных архивов! »
TROY Diamond, требуемый размер недоступен извне, повлиять на величину можно только в большую сторону.
Так и какое же решение использовать китайскую версию или продолжать корректировать манифест у готового (скомпилированного) setup.exe? »
TROY Diamond, вопрос и является ответом на него.
И после успешной установки выполнять сценарий отправки на сервер hwid пользователя (как идентификатор уникальной железяки = уникальной установки) и md5 установщика (как идентификатор реферала). »
1specific, идентификатор реферала серверу известен и его можно сравнить с тем, что клиент вернет, а вот достоверность полученного HWID сервер не проверит. А еще будут качать, но ставить без Интернет, программа установлена, но сервер подтверждение не получит.

1specific
26-01-2019, 22:39
а вот достоверность полученного HWID сервер не проверит »
Верно. Но можно проверить его уникальность по существующим уже в базам. Это уже хоть что-то.
+ если сюда включить OS и возможно какие то другие уникальные данные (например дату установки винды, или какие то данные из реестра) то уже можно хоть какой то портрет пользователя получить.
Вариантов лучше я придумать не смог. Можете что-то предложить?

А еще будут качать, но ставить без Интернет, программа установлена, но сервер подтверждение не получит. »
Ну это маловероятно учитывая специфику софта. Софт без интернета сам по себе бесполезен, так что ставить его будут те у кого интернет есть. Но если даже кто то поставит без интернета, то это небольшой процент, который можно включить в погрешность.

Iska
26-01-2019, 23:09
а вот достоверность полученного HWID сервер не проверит. »
Придумать какую-нибудь простенькую контрольную сумму, которую включать в отсылаемые данные, и по которой сервер сможет судить о том, что переданные данные были сгенерированы программно, а не представляют собой случайную отсебятину для накруток. Пока не разберут код или не накопят статистику передач — будет хоть какая-то гарантия «честности» полученных данных.

Софт без интернета сам по себе бесполезен, так что ставить его будут те у кого интернет есть. Но если даже кто то поставит без интернета, »
Ещё один плюс в пользу того, что «стучать» надо из самого приложения, а не из инсталляции.

1specific
26-01-2019, 23:31
Придумать какую-нибудь простенькую контрольную сумму, которую включать в отсылаемые данные, и по которой сервер сможет судить о том, что переданные данные были сгенерированы программно, а не представляют собой случайную отсебятину для накруток. »
Спасибо. Гениально и просто)) Насколько я знаю это еще называют солью (например в паролях её добавляют:) Ну примерно так, в целом посыл понятен )

Ещё один плюс в пользу того, что «стучать» надо из самого приложения, а не из инсталляции. »
Во первых это уже не партнерка за установку, а партнерка за запуск получится. Ну а во-вторых у меня нет возможности такое реализовать в ближайшей перспективе... Поэтому на данный момент лучше через установщик, чем никак.




© OSzone.net 2001-2012