WIX - автоматически обнаруживает и устанавливает патч MS KB

Я пытаюсь изменить пакет установщика WIX, чтобы он мог обнаруживать наличие определенного исправления / обновления базы знаний Microsoft, а затем предлагать пользователю возможность загрузить и установить его на лету, если исправление не обнаружено. Мой порядок действий будет:

  1. Определить, установлен ли пользователь на Windows 8.1 или нет (тривиально, сравнить с VersionNT).
  2. Определите, установлено ли уже KB 2883200.
  3. Если обнаружено, предоставьте диалоговое окно, предлагающее возможность загрузить и установить пакет.

меры 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

Другие вопросы по тегам