12 апреля 2017 г.

Часть 2. Clickonce приложение. Создание с нуля используя утилиту mage.exe.

Оглавление


Первым делом стоит ответить на вопросы:
  • Насколько клиенту важна Security политика и выводимые предупреждения у пользователей при установке? 
  • На сколько администраторы компании готовы вам содействовать в настройке?
Потому, что для повышения безопасности приложения в политиках домена придется раздать всем клиентам корпоративной сети заказчика сертификат с подписью манифеста и добавлением вашего сайта в доверенные.
При чем тут вообще сертификаты и прочее? Дело в том, что каждая сборка ClickOnce приложения подписывается или не подписывается сертификатом. В случае если подпись имеется, это дает возможность клиенту быть уверенным, что получив файлы приложения по сети они были созданы поставщиком, а так же в ходе хранения у заказчика не были заражены или изменены. Это достигается путем подсчета контрольной суммы не только файлов вашего решения, но и файлов ClickOnce приложения. В полном объеме это все описано в статье Общие сведения о развертывании доверенных приложений, если вы уже попробовали развернуть и запустить ClickOnce приложение у себя, то уже заметили данное сообщение при запуске:


На нем ясно написано, что Publisher (Поставщик) не известен, хотя поле могло бы быть заполнено вашей организацией. Так же снизу написано предупреждение объясняющее, к чему может привести пренебрежение безопасностью. Если для клиента главный девиз "Что бы работало", то пропускайте заморочки с постоянным сертификатом и используйте временные сертификаты  если они необходимы или же не используйте цифровую подпись.

Приведу пример запуска приложения с полностью настроенной политикой безопасности и подписью:

Важно понимать! Что если у заказчика нет домена, то установка сертификатов придется делать вручную. То же самое относится к компьютерам, которые являются портативными и не введены в домен.

Практичные способы развёртывания.

Известные мне способы создания развёртываемых ClickOnce приложений приведены ниже:
  1. Используя Visual Studio, но как мне известно, студия не умеет делать приложения без подписи.
  2. Используя утилиты Mage.exe / MageUI.exe - идущие в поставке Windows SDK. С их помощью можно создавать приложение с нуля, подписывать сборки и обновлять их.
    Приведу известные мне проблемы:
    • Самый главный минус, то что mage.exe не умеет проставлять атрибут mapFileExtensions при создании .application. Поэтому не получится создать ClickOnce приложение с использованием файлов с расширением .deploy
    • Еще один минус, это отсутствие возможности поменять стратегию обновления. По умолчанию значение:
      <deployment install="true" mapFileExtensions="true">
          <subscription>
            <update>
              <expiration maximumAge="0" unit="days" />
            </update/>
          </subscription>

        </deployment>
      Это соответствует поведению, когда при появлении новой версии она будет загружена во время работы, а не перед запуском программы. Соответственно подменить на beforeApplicationStartup обновление при создании с нуля придется самому.
  3. Создание своей утилиты, которая наполняет msbuild  скрипт <Project /> содержащий <GenerateApplicationManifest /> и <GenerateDeploymentManifest />. Данный способ является велосипедом, но дает возможность упростить создание ClickOnce приложения, сведя к минимуму задаваемые настройки. Самый главный плюс это возможно создавать не подписанные файлы манифестов, задания MapFileExtensions и прочих свойств. Как это сделать используя студию и Mage.exe я не нашел.
  4. Используя Microsoft.Build.Tasks.v4.0.dll реализовать работу по созданию ClickOnce приложения минуя msbuild (как делает mage.exe).
Теперь остановимся на каждом пункте поподробнее.

 Создание используя Visual Studio.

Использование Visual Studio налагает ряд ограничений:
  1. Ваш проект имеет все заранее заданные настройки внутри студии, тем самым если потребуется пересборка (к примеру через mage.exe), то придется задавать параметры вручную отдельно.
  2. Для сборки необходимо иметь под рукой саму студию и всё решение, это не всегда возможно.
  3. Если идет сборка на TeamCity или TFS Build придется повозиться с настройкой артефактов. Запуск задачи публикации описан тут: Построение ClickOnce-приложений из командной строки.
  4. Правку адреса для скачивание приложения придется делать отдельно вручную в блокноте, и для подписи использовать тот же Mage.exe.
Самый неоспоримый плюс в студии, это создание Setup.exe вашего проекта. Если данный сценарий развёртывания у вас не используется, то есть смысле воспользоваться mage.exe, которая быстрее и удобнее в создании ClickOnce приложения.

 Создание используя Mage.exe или MageUI.exe

С установкой Windows SDK или Visual Studio к вам на компьютер устанавливается много инструментов, в том числе mage.exe и mageUI.exe. Для того что бы найти их, если установлена студия, советую воспользоваться поиском по имени "mage" в папке C:\Program Files (x86). В случае если по каким то причина файл не нашелся, то устанавливайте Windows SDK (его можно найти введя в поиска любого поисковика "Windows SDK"). После чего файл должен быть в одной из папок по пути C:\Program Files (x86)\Microsoft SDKs\Windows. Сразу скажу, что если у вас было найдено несколько файлов, то лучше выбирать те, которые расположены в папке с верным номером х.х.х .NET Framework для вашего приложения "NETFX x.x.x Tools", так как никто не гарантирует обратную совместимость версий Mage для 3.5 и 4.5.1.
Краткое предназначение каждой из утилит:
  • Mage.exe - утилита для создания из командной строки. Справка: Mage.exe (средство создания и редактирования манифеста)
  • MageUI.exe - утилита делающее тоже самое, что mage.exe, но в оконном режиме, каких то явных возможностей, которые есть в одном, но нет в другом приложении я не нашел. Сама программа будет очень полезна для новичка, потому что дает возможность увидеть все опции наглядно.
Как ранее писалось - самый главный минус использования этих утилит является то, что с нуля они не смогут без ручных изменений, создать ClickOnce приложении которое использовало бы расширение .deloy, поскольку для этого требуется у файла .application наличие флага mapFileExtensions = "true" что mage не умеет добавлять.
Сейчас попробую продемонстрировать работу используя Mage.exe. Для начала у меня есть без изменений папка с ClickOnce приложением версии 1.0.0.51 созданное студией в Часть 1. Clickonce приложение. Пример создания в Visual Studio.
Адрес по которому находятся Launcher:
http://sapcomputer/publishroot/Application Files/WpfApplication4_1_0_0_51/WpfApplication4.application

Давайте попробуем сделать так, что бы файлы были доступны по адресу
http://sapcomputer/publishroot/MyClickOnceApp/MageWpfApplication4.application. 

То есть я хочу имеющееся приложение сделать доступных из другой директории. Для этого я, что бы не писать полный путь до mage.exe C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\mage.exe скопировал файл в корень E:\ClickOnceRoot где файлы publish.html и setup.exe.
Если скопировать один в один папку (Application Files/WpfApplication4_1_0_0_51 => MyClickOnceApp), затем переименовать файл WpfApplication4.application в MageWpftApplication4.application а внутри файла WpfApplication4.application поменять адрес: codebase="MyClickOnceApp\WpfApplication4.exe.manifest", то ничего не заработает. При запуске вы получите ошибку:
Exception reading manifest from http://sapcomputer/publishroot/MyClickOnceApp/MageWpfApplication4.application: the manifest may not be valid or the file could not be opened.

Почему так происходит?

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

Сценарий подписи. Как тогда пере подписать?
  1. Создаем временный сертификат средствами студии (помимо студии создать можно любым способом найденным в интернете). Заходим в свойства исполняемого файла, там переходим в Signing и выбираем пункт "Create Test Certificate", после чего в корне проекта создастся файл с сертификатом, который нужно использовать для подписи.
  2. Теперь используя mage.exe я поменяю codebase.
    Microsoft Windows [Version 10.0.10240]

    (c) 2015 Microsoft Corporation. All rights reserved.

    E:\ClickOnceRoot\MyClickOnceApp>..\mage.exe -Update MageWpfApplication4.application -AppCodeBase MyClickOnceApp\WpfApplication4.exe.manifest
    MageWpfApplication4.application successfully updated
  3. Последний шаг это подпись файла сертификатом, который был создан в Visual Studio.
    E:\ClickOnceRoot\MyClickOnceApp>..\mage.exe -Sign MageWpfApplication4.application -CertFile "D:\!MyProjects\DeployClickOnceApp\WpfApplication4\WpfApplication4_TemporaryKey.pfx"
    MageWpfApplication4.application successfully signed
  4. Готово! Проверяем.

Сценарий создания из чистого приложения.

Теперь давайте рассмотрим вариант установки с нуля, когда у нас имеется клиентское приложение и надо создать ClickOnce приложение.
  1. Создаем файл сертификата используя makecert.exe у меня локально он располагался по пути C:\Program Files (x86)\Windows Kits\8.1\bin\x64 - лучше воспользоваться поиском по папке C:\Program Files (x86) ссылка на справки Creating Test Certificates и MakeCert. Сам файл я так же как и mage.exe скопирую в корень для уменьшения длины путей.
    E:\ClickOnceRoot\MyApp>..\makecert -n "CN=TempCA" -r -sv TempCA.pvk TempCA.cer
    Succeeded
  2. Далее создаем файл .pfx для этого используем Pvk2Pfx утилиту. Находится она рядом с MakeCert.exe. Я ее так же скопирую в корень.

    E:\ClickOnceRoot\MyApp>..\pvk2pfx.exe -pvk ..\TempCA.pvk -spc ..\TempCA.cer -pfx ..\TempCA.pfx

    E:\ClickOnceRoot\MyApp>
    У нас получился файл TempCA.pfx аналогичный файлу WpfApplication4_TemporaryKey.pfx созданному в студии. Сам по себе файл это комок из 2 файлов. Теперь корневая папка похожа на "помойку"  но это только для удобства демонстрации использования утилит. 
     
  3. Создадим файл манифеста. Я использую минимум параметров и настроек (Точка в конце означает что будет использован текущий каталог для параметра FromDirectory

    E:\ClickOnceRoot\MyApp>..\mage.exe -New Application -v "1.0.0.99" -FromDirectory . -CertFile ..\TempCA.pfx
    application.exe.manifest successfully created
  4. Теперь переименуем файлы клиента, добавив разрешение .deploy, для этого можно написать скрипт который это делает, либо запустить MageUI.exe - нажать на создание Application Manifest и перейдя на вкладку Files:
    (P.S. Что бы воспользоваться этим способом необходимо ВРЕМЕННО убрать файлы .application и .manifest из папки, так как их на клиент передавать не надо)
    Выбираем "When populating add the .deploy extension to any file that does not have it" и жмем кнопку "Populate" после чего файлы в папке должны переименовываться.
     
  5. Осталось создать последний файл .application:
    E:\ClickOnceRoot\MyApp>..\mage.exe -New Deployment -install true -v "1.0.0.99" -AppManifest application.exe.manifest -ProviderUrl "http://sapcomputer/publishroot/MyApp/deploy.application" -IncludeProviderURL True -AppCodeBase application.exe.manifest
    deploy.application successfully created
  6. Теперь отрываем файл deploy.application и топорным способом правим его добавляя помеченным красным атрибут <deployment install="true" mapFileExtensions="true"> тегу <deploy />, будьте внимательны к названию и значению - оно регистрозависимое.

    Так же кустарным методом можно заменить по желанию:
    &lt;subscription&gt;
          <update>
            
    <expiration maximumAge="0" unit="days" />
         
    </update>
       
    </subscription>

    На обновление клиента при старте, а не после закрытия и на следующий запуск
    <subscription>
          <update>
           
    <beforeApplicationStartup />
         
    </update>
       
    </subscription>
  7. Работа практически завершена. Осталось подписать нашим файлом TempCA.pfx наш измененный файл .application.

    E:\ClickOnceRoot\MyApp>..\mage -Sign application.exe.manifest -CertFile ..\TempCA.pfx
    application.exe.manifest successfully signed
  8. Перейдя по ссылке http://sapcomputer/publishroot/MyApp/deploy.application и нажав "Установить" приложение успешно установилось.
В итоге если выкинуть создание pfx файла, который нужен один раз, создать скрипт для переименования и замены значений в XML файле, то вариант может стать практичным и рабочим. В интернете сможете найти PoweShell скрипт, который собственно и делает описанные тут действия, но потребует наличие еще и PowerShell.
P.S. Я не рассмотрел вариант использования MageUI.exe, но он полностью визуальный и не сможет подойти на роль практической автоматизации, но думаю можно без проблем создать ClickOnce приложение с нуля без подготовки.

Создание собственной утилиты для создания ClickOnce приложений.

Если после прочтенного выше у вас упало желание использовать Mage для создания и поддержки ClickOnce, тогда вариант с "приватной утилитой", для выполнения выполнения ваших нужд - это решение для вас. В части 3, я расскажу о моей созданной утилите, которая пока не умеет работать с командной строкой, но умеет делать все выше сказанное в 2 щелчка и умеет просчитывать известные мне проблемы, вовремя информируя пользователя.

Ссылка на третью часть:
Часть 3. Альтератива Mage.exe. Утилита для создания ClickOnce приложений.

Комментариев нет:

Отправить комментарий