ClickOnce Предпосылки: ошибка: опубликованный установщик может быть поврежден - программирование

ClickOnce Предпосылки: ошибка: опубликованный установщик может быть поврежден

Я создал специальный установочный пакет для установки некоторых шрифтов на клиентской машине и развернул его в папку с предварительными условиями в C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bootstrapper\Packages\FontsInstaller. Все в порядке, ссылаясь на него как на предварительное условие в Visual Studio 2010, и я могу опубликовать приложение без проблем.

Клиент, с другой стороны, получает сообщение об ошибке во время проверки Хэша:

Проверка хеша файла

Ошибка: программа установки обнаружила, что файл 'C:\Users\RMORAN ~ 1\AppData\Local\Temp\VSD4684.tmp\FontsInstaller\fontsinstaller.msi' либо изменился, поскольку он был первоначально опубликован, либо может быть поврежден.

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

Теперь я нашел отчет об ошибке Microsoft Connect, в котором говорится:

"У меня есть специальный пакет bootstrapper, установленный как предварительное условие для моего приложения. Когда я создаю его в системе с установленной Visual Studio 2012, установка завершится с ошибкой:

Программа установки обнаружила, что файл"... "либо изменился, поскольку он был первоначально опубликован, либо может быть поврежден.

Я создаю Visual Studio 2010 без изменений в пакете или проектах. Когда Visual Studio 2012 не установлен, это работает так, как ожидалось."

Я попытался создать этот установщик на другой рабочей станции без установки VS2012, и он передает проверку хэша на клиенте (я столкнулся с проблемой подписи, но это другая история). Это действительно проблема с машиной сборки с VS2012, а не с клиентом, поскольку пакет, созданный на моей исходной рабочей станции, также терпит неудачу на машине, у которой нет VS2012.

Кто-нибудь еще испытал эту проблему, если это так, вы нашли обходной путь, не установив VS2012?

4b9b3361

Ответ 1

Я использовал инструмент отражения, чтобы посмотреть на задачу MSBuild генерации загрузочного образа (на компьютере с установленным .NET 4.5) и обнаружил, что он увеличивает элементы product.xml file <PackageFile />. В частности, он пытается вычислить открытый ключ из каждого файла. Если он может найти один, он сравнивает ключ со значением атрибута PublicKey. Если значения отличаются друг от друга, он выдает предупреждение, но в обоих случаях он сохраняет только что вычисленное значение.

Если он не может определить открытый ключ, он затем вычисляет хэш SHA256 файла и выполняет аналогичное сравнение со значением атрибута Hash, выдавая предупреждение, если они разные, и устанавливает значение Hash с вычисленным значением.

Вы можете подтвердить эти данные, извлекая ресурс SETUPCFG из результирующего setup.exe; это текстовая версия слияния файлов product.xml.

В любом случае, помните, как я сказал, что он вычисляет хэш SHA256 файлов, если он не может найти открытый ключ? Документация для <PackageFiles> Элемент (Bootstrapper) говорит, что значение атрибута Hash должно быть хэшем SHA1.

Мне не удалось проверить, какой из SHA1 или SHA256 использует setup.exe, чтобы проверить значение атрибута Hash (неуправляемый код и я не смог найти для него символы), но пусть запись показывают, что аналогичный взгляд на версию .NET 4.0 генератора MSBuild генератора bootstrapper показывает, что он действительно использует алгоритм SHA1 для вычисления значения атрибута Hash, поэтому путем вычета можно сказать setup.bin (по крайней мере, один из Windows SDK v7.0A) использует SHA1. Я уверен, что я попытался использовать setup.bin из Windows SDK v8.0A, и получил те же (неправильные) результаты. (Можно было бы подтвердить это, скопировав setup.bin из SDK v8.0A на компьютер с .NET 4.0 и посмотрев, сможет ли результирующий setup.exe установить собственный пакет bootstrapper с использованием проверки на основе хэшей)

Итак, если проверка на основе хэша нарушена в настройке bootstrapper, мы можем, по крайней мере, использовать проверку открытого ключа (на основе сертификата). Хорошей новостью является то, что генератор начальной загрузки автоматически начнет использовать этот механизм, если он сможет извлечь открытый ключ сертификата из файла пакета. Плохая новость заключается в том, что это означает, что каждый файл пакета должен быть подписан с signtool.exe и действительным сертификатом подписи кода (не все могут иметь сертификат подписи кода, но если вы делаете клик-один раз, вы можете...).

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

tl; dr: Подпишите свои файлы пакетов с сертификатом подписи кода, чтобы избежать дефекта, внесенного в .NET 4.5.

Ответ 2

Вам нужно изменить GenerateBootstrapper Path на:

C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bootstrapper

to

C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\Bootstrapper

Ответ 3

Вам нужно изменить GenerateBootstrapper Path:

C:\Program Files (x86)\Microsoft SDK\Windows\v7.0A\Bootstrapper

к

C:\Program Files (x86)\Microsoft SDK\Windows\v8.1A\Bootstrapper

и скопируйте пакеты msi (которые вы хотите использовать) из C:\Program Files (x86)\Microsoft SDK\Windows\v7.0A\Bootstrapper в C:\Program Files (x86)\Microsoft SDK\Windows\v8.1A\Bootstrapper