подскажите плиз.
Откуда MSI при установке берёт upgradecode?
когда выполняет функцию Findrelatedproducts.
При поиске реестра на предмет апгрейдкода
не нашёл в реестре записи.
Тем не менее MSIшка как то находит и выводит что у меня установлен
этот продукт с таким апгрейт уодом (я его в таблицу Апгрейд записал)
С другой стороне некоторые не находит вообще когда я точно знаю что приложение с таким номером апгрейд кода установленно. версию, язык я указаю вроде правильно.
НАпример 1033 как в тэмплейте потока так и в пропертях.
а искать версию от 1.0.0 до 5.0.0 и не находит например 2.0.0
А некоторые находит. От чего
это зависит?
код продукта я тоже новый указал.
В чём причина?
Re: Код UPGRADE
От:
Аноним
Дата:
23.06.06 07:45
Оценка:
Лажа в том что не находит установленный продукт если его установить "для всех пользователей".
Как с этим бороться никто не в курсе?
Что FindralatedProduct ищет только установленные для текущего пользователя?
Где всё таки хрианится инфа про апгрейд коды?
В реейстрв только коды продукта нашёл.
Не роется же оно в MSI щках в кэше. Кстати проверял удалял MSI из кєша.
Всё равно находит зараза от куда то Апгрейд коды.
Откуда оно их берёт?
Особенно интересует если ищется установленные продукты для всех юзеров.
Здравствуйте, Nigel, Вы писали:
N>Откуда MSI при установке берёт upgradecode?
Понятно, что из самой инсталяшки. Таблица Property, поле UpgradeCode.
N>когда выполняет функцию Findrelatedproducts.
Из реестра.
N>При поиске реестра на предмет апгрейдкода N>не нашёл в реестре записи.
Проблема в том, что запись не в том виде, в котором Вы ее ожидаете.
Я для простоты накидал скриптик на VB. Скиньте его в файлик и вы получите трансформированный код, который можете искать в реестре.
Например, в ветке HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UpgradeCodes
function reverseStr(str)
Dim res, cPos, cChr, strLen
strLen = Len(str)
for cPos=1 To strLen
cChr = Mid(str, cPos, 1)
res = cChr & res
next
reverseStr = res
end function
function reverseStrByPair(str)
Dim res, cPos, cChr, strLen
strLen = Len(str)
for cPos=1 To strLen Step 2
cChr = Mid(str, cPos+1, 1) & Mid(str, cPos, 1)
res = res & cChr
next
reverseStrByPair = res
end function
function getRegistryPackageCodeFromGuid(strGuid)
' remove brackets from GUID if they exists
strGuid = Replace(strGuid, "{", "")
strGuid = Replace(strGuid, "}", "")
guidParts = Split(strGuid, "-")
getRegistryPackageCodeFromGuid = reverseStr(guidParts(0)) & reverseStr(guidParts(1)) & reverseStr(guidParts(2)) _
& reverseStrByPair(guidParts(3)) & reverseStrByPair(guidParts(4))
end function
function getGuidFromRegistryPackageCode(strCode)
Dim resStr, strPart, lPos, rPos, cnt
' remove brackets from GUID
cPart = Left(strCode, 8)
resStr = reverseStr(cPart) & "-"
cPart = Mid(strCode, 9, 4)
resStr = resStr & reverseStr(cPart) & "-"
cPart = Mid(strCode, 13, 4)
resStr = resStr & reverseStr(cPart) & "-"
cPart = Mid(strCode, 17, 4)
resStr = resStr & reverseStrByPair(cPart) & "-"
cPart = Mid(strCode, 21, 12)
resStr = resStr & reverseStrByPair(cPart)
getGuidFromRegistryPackageCode = resStr
end function
sub usage
WScript.Echo "Converts Package, Product or Upgrade code from canonical to registry key representation or vice versa."_
& vbCrLf & "Usage: " & WScript.ScriptName & " [PackageCode [rev]]" _
& vbCrLf & " PackageCode - Package, Product or Upgrade code" _
& vbCrLf & " rev - reverse conversion" _
& vbCrLf & "Script doesn't check correctness of code and its format. E.g. if you omit rev flag but entered " _
& "registry form, error will occur"end sub
argCount = Wscript.Arguments.Count
If argCount = 0 then
usage
elseif argCount = 1 then
WScript.Echo getRegistryPackageCodeFromGuid(Wscript.Arguments(0))
elseif argCount = 2 then
WScript.Echo getGuidFromRegistryPackageCode(Wscript.Arguments(0))
end If
N>С другой стороне некоторые не находит вообще когда я точно знаю что приложение с таким номером апгрейд кода установленно. версию, язык я указаю вроде правильно.
N>НАпример 1033 как в тэмплейте потока так и в пропертях.
N>а искать версию от 1.0.0 до 5.0.0 и не находит например 2.0.0
N>А некоторые находит. От чего N>это зависит? N> код продукта я тоже новый указал. N>В чём причина?
Убедитесь, что Вы правильно указали атрибуты в таблице Upgrade. Это одна из возможных причин.
Успехов!
К этому моменту у меня внутри 0.5, 0.7, 0.33 (с) НС
Здравствуйте, Аноним, Вы писали: А>Лажа в том что не находит установленный продукт если его установить "для всех пользователей". А>Как с этим бороться никто не в курсе? А>Что FindralatedProduct ищет только установленные для текущего пользователя?
Может быть проблема в том, что
The FindRelatedProducts action only runs the first time the product is installed. The FindRelatedProducts action does not run during maintenance mode or uninstallation.
?
К этому моменту у меня внутри 0.5, 0.7, 0.33 (с) НС
The FindRelatedProducts action only runs the first time the product is installed. The FindRelatedProducts action does not run during maintenance mode or uninstallation.
?
Спасибо большое за инфу по реестру буду разбираеться
Но по идеи оно должно ведь как то работать стандартно?
Я плохо описал проблему.
По пробую точнее описать.
1. В "старой" версии пакета MSI. добавляю апгрейт кодом (на самом деле он там есть и так)
2. сождаю "новую" версию ногого продукта с новым кодом продукта в пакете MSI
также завполнив Таблицу Upgrade как положено.
Проблема заключается в следующем. "старая" Программа по логике работы не должна устанавливаться только под одного пользователя, но всегда на машину (ALLUSERS = 1)
И если я "старую" программу устанавливаю под ALLUSERS = то есть под текущего пользователя то "новая" програма благополучно находит в ходе выполнения
функции FindRelatedProdtuct, заполнея ссоответсвующее проперти кодом продукта старой программы.
Если же я "старую" программу устанавливаю под ALLUSERS = 1 то есть для всех пользоваьедей (а она должна именно так быть установленна) то когда
после того как установил "старую" программу для всех пользователей
получается что FindRelatedProdtuct запускаемая ПРИ УСТАНОВКЕ (а не maintenance)
ничего не находит благополучно идя дальше и не прибавляет к соответсвующему проперти
указаненому в Апгрейд таблице НИЧЕГО.
В чём проблема?
Я пробывал программу обновления запускатиь под разными ALLUSERS. Ничего не выходит.
Если "старая" программа установленна для ВСЕХ пользователей то оно её не видит.
Как выйти из ситуэйшена?
Тут какая то мелкая чепуха но я не могу её найти. Ведь не может быть чтобы апгрейд был возможен только для программ установленных текущим юзером только для себя?
И вообще с этими пользывателями беда. Приходится например если точно хочешь знать
чтобы DLL будет зарегестрированно для всех пользователей а не только для текущего
писать инфу не в Класес рут анепосредственно в Локал МАшин классес.
Иначе оно считает что Классес рут это из ветки карент юзер а не из локал машин.
Я раньше думал что может дело в правах. Но "привелегед"свойство установленно ьл есть равно 1
кроме того насколько я знаю что если нет прав то оно вообще не позволяет
устанавливать для всех пользователей То есть просто если поставить AllUSERS 1
по тдеи должно обламаться и не устанавливать вообще.
Здравствуйте, Nigel, Вы писали:
N>В чём проблема?
В общем, я пока не могу так сказать, в чем она может быть. Новых мыслей нету. Там может быть куча проблем, на самом деле. Надо анализировать.
Самое простое — запустите новую инсталяшку с логированием (ключ /l*v ) и проанализируйте лог, например, поищите текст FindRelatedProducts и посмотрите что творится вокруг этих действий.
Если что-то интересное и непонятное найдете — пишите. Подумаем.
Успехов!
К этому моменту у меня внутри 0.5, 0.7, 0.33 (с) НС
Action 15:50:28: FindRelatedProducts. Searching for related applications
Action start 15:50:28: FindRelatedProducts.
FindRelatedProducts: Found application: {5D2AF90E-E241-4A87-A8F3-6383EF677815}
MSI (c) (2C:20) [15:50:28:839]: PROPERTY CHANGE: Modifying PREVIOUS_ID property. Its current value is '0'. Its new value: '0;{5D2AF90E-E241-4A87-A8F3-6383EF677815}'.
Action ended 15:50:28: FindRelatedProducts. Return value 1.
Action 16:33:39: FindRelatedProducts. Searching for related applications
Action start 16:33:39: FindRelatedProducts.
MSI (c) (F8:A0) [16:33:39:293]: FindRelatedProducts: current install is per-user. Related install for product '{5D2AF90E-E241-4A87-A8F3-6383EF677815}' is per-machine. Skipping...
Action ended 16:33:39: FindRelatedProducts. Return value 1.
То есть оно находит номер но не устанавливает потому что установка
идёт не пер машин. Как сделать чтобы пер машин?
Я устанавливаю ALLUSERS = 1 Та же байда выходит.
Ещё у меня проблема . Если например нужно чтобы пользыватель всё таки удалил в процессе апгрейда предудыщие версии установленные пер машин?
Оказывается нужно не просто свойству ALLUSERS присвоить 1 в таблице пропертей.
А явно перед FindRelated actions вызвать ещё custumAction тип 51 явно устанавливая свойство ALLUSERS в 1.
Потому как очевидно из таблицы Property оно не берётcя (не даром наверное его там и нет изначально).
Action 16:49:48: actSetUsers.
Action start 16:49:48: actSetUsers.
MSI (c) (38:84) [16:49:48:043]: PROPERTY CHANGE: Adding ALLUSERS property. Its value is '1'.
Action ended 16:49:48: actSetUsers. Return value 1.
MSI (c) (38:84) [16:49:48:043]: Doing action: FindRelatedProducts
Action 16:49:48: FindRelatedProducts. Searching for related applications
Action start 16:49:48: FindRelatedProducts.
FindRelatedProducts: Found application: {5D2AF90E-E241-4A87-A8F3-6383EF677815}
MSI (c) (38:84) [16:49:48:074]: PROPERTY CHANGE: Modifying PREVIOUS_ID property. Its current value is '0'. Its new value: '0;{5D2AF90E-E241-4A87-A8F3-6383EF677815}'.
Action ended 16:49:48: FindRelatedProducts. Return value 1.
Теперь мне другое непонятно. Если напотиер нужно одновременно нати и удалить продукты установленный как для текущего пользхователя так и для всей машины.
Как быть? Ведь насколько я понял знаю FindRelatedProduct вызвается только один раз.
А что будет если я два раза её вызову в UISequence перед этим установив по разному с разными ALLUSERS?
N>Первый вопрос вроде разобрал.
N>Оказывается нужно не просто свойству ALLUSERS присвоить 1 в таблице пропертей. N>А явно перед FindRelated actions вызвать ещё custumAction тип 51 явно устанавливая свойство ALLUSERS в 1. N> Потому как очевидно из таблицы Property оно не берётcя (не даром наверное его там и нет изначально).
Очень странно. Если оно есть в таблице Property и равно 1, то оно там так и должно оставаться. Скорее всего, пропертя меняется какой-нибудь CustomAction или например после поиска AppSearch.
N>Теперь мне другое непонятно. Если напотиер нужно одновременно нати и удалить продукты установленный как для текущего пользхователя так и для всей машины. N>Как быть? Ведь насколько я понял знаю FindRelatedProduct вызвается только один раз. N>А что будет если я два раза её вызову в UISequence перед этим установив по разному с разными ALLUSERS?
Да, оно отработает один раз. Более того, думаю, вам следует как-то определить, что установлен продукт для CurrentUser. Я поковыряю, постараюсь найти, но попозже.
Успехов!
К этому моменту у меня внутри 0.5, 0.7, 0.33 (с) НС
Re[8]: Код UPGRADE
От:
Аноним
Дата:
25.06.06 07:03
Оценка:
Здравствуйте, WPooh, Вы писали:
WP>Здравствуйте, Nigel, Вы писали:
WP>Очень странно. Если оно есть в таблице Property и равно 1, то оно там так и должно оставаться. Скорее всего, пропертя меняется какой-нибудь CustomAction или например после поиска AppSearch.
Да вроде бы нет потому как FindrelaedProduct выполняется одним из первых.
Других CustomAction вообще нету никаких (я как раз и добавил чтобы установить)
Не вру. Есть какое-то то встроенныще в Wise инициализирующее customAction.
Тем не менее всё равно не понятно. По логике сначало должен быть выбор типа установки а потом FindRelatedProduct. Иначе если я например выбиру уже в диалоге то толек с того ведь в последывательности execute даже если это действие есть то правильно оно по стандарту вроде бы не должно запуститься если уже запускалось.
Вот пришлось обойти эту дурацкую логику установив принудительно в самом начале
свойство ALLUSERS = 1. При чём при помощи действия а не просто записав в проперти.
А я так думаю что вообще FindRelatedProduct по уму надо убрать из последывательности
UI последовательности и добавить уже к кнопке NEXT после того как отработал диалог "выбор типа установки для всех или только для вас" Кстати по логике выходит что нужно обязательно и дизаблить возможность перевыбора раз FindRelatedProduct может отработать только раз...
А то и вообще убрать его на фиг оставив только в Еxecute полследовательности.
В общем эта тема не очень чётко проработана в инсталяторах вообще я думаю.
Но мне проще так как надо сделать только один вариант установки — для всех пользывателей.
А предыдущие версии продукта устанавливались как попало.
Нужно если предыдущая версия была установленно только для одного пользывателя попытаться снести и её. Тут возникает сложность. Заранее нельзы знать как она была установленна.
К тому же не исключенно что какие то версии продукта установлены для всех а какие-то только для одного польззыателя. И такое бывает. Как де отдним инсталятором их найти и снести все если FindRelatedProduct работеет только один раз и только в каком то одном режиме (для пользователи или для всех)?
WP>Да, оно отработает один раз. Более того, думаю, вам следует как-то определить, что установлен продукт для CurrentUser. Я поковыряю, постараюсь найти, но попозже.
Да было бы не плохо. FindRelatedProduct я пытался два раза запустить (ну естественно не в однну даблицу пихая одно и тоже действие потому как это ключевой столбец) а вызывая кастом актион которое вызывает ещё раз FindRelatedProduct после модификации ALLUSERS = {} нифига не вышло ...