Как включить KB2670838 в установщик с помощью InstallShield 2013?


Я использую InstallShield 2013 для создания базового установщика MSI для приложения, которое требует обновления платформы Windows KB2670838.

Для .NET Framework и других требований я выбираю их в InstallShield в разделе Redistributables. KB2670838 недоступен.

Если я загружаю KB2670838 из Microsoft, я получаю файл .msu. Можно ли это как-то включить в установщик, чтобы он автоматически устанавливался при необходимости? Если нет, есть ли способ остановить установку и скажите пользователю, что " KB2670838 требуется, но не установлен. Давай сюда...- что?

5 3

5 ответов:

@Глытжкоф хороший момент. Так как же заставить InstallShield прервать работу и дать пользователю хорошее сообщение, чтобы он знал, что делать? - shoelzer 1 час назад

Тогда я просто добавлю новый ответ - слишком долго писать в комментарии.

  • Найдите сведения о файле , которые необходимо просмотреть в разделе " Подробнее Информация: Информация о файле " в этой статье kdb: http://support.microsoft.com/kb/2670838/en
  • выберите несколько файлов для сканирования. для и добавить в качестве поиска файлов в Installshield (см. ниже скриншот). Вы указываете свойство для каждого файла (FILE1FOUND, FILE2FOUND, FILE3FOUND и т. д...), и если поиск совпадает с деталями файла (версия, размер, дата и т. д...) свойству присваивается полный путь к файлу. В противном случае свойство не определено или установлено в значение по умолчанию (скриншот показывает предопределенный поиск, а не поиск файла, но вы понимаете идею).
  • Наконец вы добавляете условие запуска записи для каждого файла убедитесь, что все файлы, выбранные для проверки, имеют правильную версию или выше. Я думаю, что это в предпосылках или что - то подобное-я не могу вспомнить. Откройте скомпилированный MSI-файл и убедитесь, что он выглядит как таблица LaunchConditon.

Вид поиска Installshield

Для протокола: (не является частью вышеупомянутого предложения)

Лично я за то, чтобы кодировать один сценарий для сложной логики, как это, чтобы гарантировать, что логика может быть проверена в целом и критически тестировался в целом вне файла MSI. Также полезно добавить комментарии к такому коду, чтобы объяснить, что скрипт проверяет и почему (помогает корпоративному развертыванию). Сценарий может быть запущен через десятки тестов против машины непосредственно без перекомпиляции MSI. Это может сэкономить много времени, если логика сложная. При написании скомпилированной библиотеки dll можно отобразить окно сообщения и присоединить отладчик visual studio к msiexec.exe-процесс (клиент или сервер в зависимости от контекста вашего пользовательского действие выполняется в) и пошаговом коде, пока он встроен в MSI, но это, похоже, выходит за рамки вашего сценария. Просто хочу упомянуть об этом для других людей, которые могли бы прочитать это. Также проверьте Стефана Крюгера installsite.com для получения дополнительной информации о сложной настройке отладки, как это.

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

В InstallShield это обновление обычно следует доставлять в качестве предварительного условия (инструменты > редактор предварительных условий) или в виде пакета, включенного в комплект (ссылка [SystemFolder]wusa.exe для установки файла .msu). В обоих случаях это логически отделяет распространяемую установку от установки вашего пакета, предоставляя пользователям единый интерфейс установки.

Глытжкоф упоминает несколько действительно хороших моментов о том, как определить, было ли установлено обновление. Вы вы захотите включить их в свои условия (в пакет предварительных условий или комплект), а также в обнаружение обновления или его отсутствия в вашем пакете .msi, чтобы он мог прерваться, если требуемое обновление не было установлено к моменту запуска .msi.

Список Установка и удаление программ в реестре может помочь вам получить приблизительное представление о том, что установлено:

  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall

Похоже, что это не дает полного списка того, что установлено, хотя: http://social.technet.microsoft.com/Forums/windows/en-US/d913471a-d7fb-448d-869b-da9025dcc943/where-does-addremove-programs-get-its-information-from-in-the-registry?forum=w7itprogeneral

Другим способом может быть использование информации о файле из статьи базы знаний: http://support.microsoft.com/kb/2670838/en (для получения дополнительной информации : информация о файле) и используйте функцию Wix / MSI AppSearch / LaunchCondition. Это должно сделать трюк, хотя я находите синтаксис немного нелогичным.

Другой подход заключается в том, чтобы написатьпользовательское действие и объединить эти два источника (добавить /удалить запись и информацию о файле). Такое пользовательское действие не внесет никаких изменений в систему и, следовательно, менее проблематично, чем другие пользовательские действия, которые вызывают проблемы отката. Я считаю, что проще протестировать и поддерживать пользовательское действие в случае, если в какой-то момент потребуются дополнительные предварительные условия. Впрочем, это дело вкуса. Я просто считаю, что это легче сделать. запустите сценарий предварительных условий для выбора файлов, чтобы проверить, что он их правильно идентифицирует и выполняет, как ожидалось, чем продолжать запускать файл MSI для каждого теста.

Вот аналогичный вопрос с некоторыми указателями из superuser.com: https://superuser.com/questions/521175/determine-if-windows-hotfix-has-been-applied

И еще одна ссылка на serverfault.com (сайт системного администрирования). Хороший подход с использованием PowerShell , который, безусловно, можно перенести к пользовательскому действию: https://serverfault.com/questions/312778/determine-if-user-has-hotfix-981889-installed

Еще больше serverfault.com материал, включающий обновление.exe, WMI и скрипт Powershell для просмотра всех установленных исправлений: https://serverfault.com/questions/263847/how-can-i-query-my-system-via-command-line-to-see-if-a-kb-patch-is-installed . рекомендуется читать . Microsoft: http://technet.microsoft.com/en-us/library/hh849836.aspx

PSInfo , кажется, может показать установленные исправления: http://technet.microsoft.com/en-us/sysinternals/bb897550

Позвольте мне попытаться добавить ответ в стиле ссылки , поскольку мой другой ответ немного органичен, чтобы сказать по меньшей мере на этом этапе - я оставлю его, так как он содержит обсуждение MSI. см. рекомендацию MSI в среднем разделе ниже :

WMI:

wmic qfe where "HotfixID = 'KB973687'"

PowerShell: (просто get-исправление для полного списка)

get-hotfix | findstr "981889"

SystemInfo (удалить аргументы для формата списка):

systeminfo /fo csv

PSInfo (кажется чтобы не перечислять все на всех машинах, и не может работать молча должным образом):

PSinfo -h

Реестр (видимо, не полный список исправлений):

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall

Для MSI custom action use я бы на самом деле использовал пользовательское действие, которое проверяет версии файлов, как описано в моем другом ответе. Очень надежный, и принимает во внимание, что исправление может быть устаревшим, пока файлы все еще до дата.


Ссылки :

Имел ту же проблему и решил ее, добавив необходимое условие сценария PowerShell и пакетный файл для его выполнения.

пре. ps1 файл выглядит примерно так:

function TestConnection
{
    Test-Connection -ComputerName "8.8.8.8" -Quiet
}

get-hotfix -id KB2670838
if(!$?){
    #SourceURI = "https://download.microsoft.com/download/1/4/9/14936FE9-4D16-4019-A093-5E00182609EB/Windows6.1-KB2670838-x64.msu";
    #$FileName = $SourceURI .Split('/')[-1]
    #$BinPath = Join-Path $DownloadPath -ChildPath $FileName
    Invoke-Webrequest -Uri $SourceURI -OutFile $BinPath
    #Start-Process -FilePath $BinPath -ArgumentList "/q /norestart" -Wait -NoNewWindow
}

пре.cmd файл выглядит примерно так:

@echo off
::set PS_FILE=%~dp0Prerequisite.ps1
set PS_FILE=%~dpn0.ps1
set PS_EXEC_PATH=%SystemRoot%\sysnative\WindowsPowerShell\v1.0\
set PS_EXEC_PATH=%SystemRoot%\System32\WindowsPowerShell\v1.0\
::set PS_EXEC_PATH=%SystemRoot%\SysWOW64\WindowsPowerShell\v1.0\
set PS_EXEC_PATH=
set PS_EXEC=%PS_EXEC_PATH%powershell.exe
echo %PS_EXEC%
echo %PS_FILE%

::%PS_EXEC% -file %PS_FILE% set-executionpolicy remotesigned
::%PS_EXEC% -NoProfile -ExecutionPolicy Bypass -Command "& '%PS_FILE%'"
::This is with admin rights
%PS_EXEC% -NoProfile -Command "& {Start-Process PowerShell.exe -ArgumentList '-NoProfile -ExecutionPolicy Bypass -File ""%PS_FILE%""' -Verb RunAs}"

::pause