WIX - автоматически обнаруживает и устанавливает патч MS KB
Я пытаюсь изменить пакет установщика WIX, чтобы он мог обнаруживать наличие определенного исправления / обновления базы знаний Microsoft, а затем предлагать пользователю возможность загрузить и установить его на лету, если исправление не обнаружено. Мой порядок действий будет:
- Определить, установлен ли пользователь на Windows 8.1 или нет (тривиально, сравнить с
VersionNT
). - Определите, установлено ли уже KB 2883200.
- Если обнаружено, предоставьте диалоговое окно, предлагающее возможность загрузить и установить пакет.
меры 2
а также 3
не на 100% очевидны для меня. Я нашел возможное решение в другом посте Stackru, но я не понимаю, почему нужно указывать и хэш, и номер КБ. например:
Функция образца
public static bool IsPatchAlreadyInstalled(string productCode, string patchCode)
{
var patches =
PatchInstallation.GetPatches(null, productCode, null, UserContexts.Machine, PatchStates.Applied);
return patches.Any(patch => patch.DisplayName == patchCode);
}
использование
IsPatchAlreadyInstalled("{F5B09CFD-F0B2-36AF-8DF4-1DF6B63FC7B4}", "KB2468871");// .NET Framework 4 Client Profile 64-bit
IsPatchAlreadyInstalled("{8E34682C-8118-31F1-BC4C-98CD9675E1C2}", "KB2468871");// .NET Framework 4 Extended 64-bit
IsPatchAlreadyInstalled("{3C3901C5-3455-3E0A-A214-0B093A5070A6}", "KB2468871");// .NET Framework 4 Client Profile 32-bit
IsPatchAlreadyInstalled("{0A0CADCF-78DA-33C4-A350-CD51849B9702}", "KB2468871");// .NET Framework 4 Extended 32-bit
Итак, первая часть моего вопроса будет такой: как я могу использовать приведенный выше код, чтобы определить, установлено ли исправление KB 2883200, и как мне сгенерировать соответствующий хэш /UUID для первого аргумента, переданного функции?
Далее я пытаюсь сделать модальное диалоговое окно, предлагающее пользователю возможность установить патч? Если пользователь установит "Назад" в программе установки, я бы хотел, чтобы диалог снова появлялся при достижении соответствующего шага, на случай, если он случайно отклонил предложение установить драйвер.
Для второй и последней части моего вопроса: как мне предоставить такое диалоговое окно, и есть ли какой-либо существующий метод для загрузки и установки патча MS KB через установщик, или я должен реализовать свои собственные методы с нуля?
Спасибо.
1 ответ
Диалоговое окно будет диалоговым окном, которое вы вставляете в последовательность интерфейса MSI, и показывает его, если обновление не установлено, и публикует диалоговое окно с условием. Потенциальная проблема с выполнением всего этого в последовательности пользовательского интерфейса заключается в том, что вы не будете повышены, поэтому, если для этого требуются повышенные привилегии, у вас могут возникнуть некоторые трудности.
Я думаю, что предложение Тома - способ сделать это - сделать его обязательным условием, для которого вы создадите свой собственный исполняемый файл, чтобы проверить его, интегрируйте это с Burn.
В любом случае, для проверки и установки обновления я бы использовал Windows Update API. Обновление доступно через Центр обновления Windows, и он сообщает вам, применимо ли обновление к определенной системе, а также загружает его:
https://msdn.microsoft.com/en-us/library/windows/desktop/aa387102(v=vs.85).aspx