четверг, 3 апреля 2014 г.

Проблемы, возникающие при подготовке Windows-программ для распространения. Часть 3. Интеграция с инсталлятором

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

Способы активации

Способы активации, которые должен, в общем случае, поддерживать установщик, такие же, как и при активации непосредственно из приложения, с небольшим дополнением:

  • Активировать при помощи серийного номера
  • Активировать при помощи ключевого файла лицензии
  • Активировать пробную версию
  • Активировать позже
  • Уже активировано на данном компьютере

Опция "уже активировано на данном компьютере" по своему действию аналогична опции "активировать позже" (не производит никаких действий), но ее наличие помогает избежать вопросов при повторной установке (при обновлении ПО): "что делать, если приложение уже было активировано на моем комьютере?".

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

Типы установки

Типы установки приложения, как и типы активации, описанные ранее, подразумевают возможность установить приложение как для всех пользователей, так и только для текущего пользователя.

Иногда, чтобы упростить себе работу, создатель инсталляционного пакета просто выводит сообщение через функцию MessageBox - "установить приложение для всех пользователей? Да/Нет.", но это не самый лучший и понятный для пользователя способ. Гораздо более правильно создать отдельную страницу мастера установки, на следует которой предоставить возможность выбора из двух вариантов, выбираемых при помощи радиокнопок. Такой способ выбора будет гораздо более нагляден и понятен пользователю.


вторник, 1 апреля 2014 г.

Проблемы, возникающие при подготовке Windows-программ для распространения. Часть 2. Диалог активации

Если используемый вами протектор имеет встроенные функции отображения диалога(ов) активации, значит, эта печаль обошла вас стороной (если, конечно, вас всё устраивает в этих диалогах). API VMProtect не не предоставляет подобных функций, поэтому диалог активации нам пришлось делать самим.

Для того, чтобы диалог активации можно было легко перенастроить под потребности любого приложения, он бы спроектирован таким образом, чтобы поддерживать все возможные типы и способы активации.

Способы активации

Ориентируясь на API VMProtect и на собственные потребности, были сформулированы требования к диалогу активации. Так, от диалога активации требуется уметь активировать приложение следующими способами:

  • Активировать при помощи серийного номера
  • Активировать при помощи ключевого файла лицензии
  • Активировать пробную версию

Если приложение позволяет работу в режиме без активации (в том числе и без активации пробной лицензии), необходимо также добавить опцию "активировать позже".

Если приложение позволяет производить offline активацию (в API VMProtect для этого есть соответствующие функции), то необходимо предусмотреть возможность отображения данных для offline активации.

Ввод серийного номера

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

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

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

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

Типы активации

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

  • только для текущего пользователя
  • для всех пользователей данного компьютера

Если вы хотите создать качественное приложение, и/или у вас гибкие условия лицензирования использования приложения, то вам следует предоставлять пользователю возможность выбора типа активации.

Повышение привелегий

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

Кастомизация внешнего вида диалога

Диалог активации может иметь фиксированные размеры, но иногда это может быть неудобно пользователям. Следует предусмотреть поддержку изменения размеров диалога с соответствующим изменением размера и положения элементов ввода.

Также не стоит прибивать гвоздями расположение кнопок "Ok", "Отмена", "Повысить привилегии" - желательно предусмотреть возможность их расположения слева, справа или по центру; в нижней части диалога или выровненными по верхнему краю.


Проблемы, возникающие при подготовке Windows-программ для распространения. Часть 1. Хранение данных лицензии на компьютере пользователя и виртуализация Windows

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

Новая система безопасности Windows, которая была добавлена с систему, начиная Windows Vista, безусловно повысила безопасность работы в системе, но программистам только добавила забот.

Виртуализация реестра и файловой системы

Для того, чтобы старые программы, привыкшие работать под Windows 2000 и Windows XP могли без изменений работать под системами Windows Vista+, приложению даются права на запись в общую ветвь реестра - HKEY_LOCAL_MACHINE\Software, а также на запись в некоторые части файловой системы, но реальная запись происходит в ветку HKEY_LOCAL_MACHINE\_Classes\VirtualStore\Machine\Software. Аналогичная ситуация имеет место быть и для файловой системы.

Статус виртуализации определяется следующими параметрами (тут могут быть неточности):

  1. Виртуализация включена, когда приложение запущено с обычными правами и
    • отсутствует манифест приложения;
    • в манифесте не указано, что следует отключить виртуализацию. Такие манифесты добавляют, как минимум, MSVC2005 и MSVC2008.
  2. Виртуализация выключена
    • в манифесте указано отключение виртуализации;
    • когда приложение запущено с повышенными правами.

Основная проблема с виртуализацией состоит в том, что если вы записали данные лицензии в ветку HKEY_LOCAL_MACHINE\Software, то вы ожидаете, что программа будет работать для всех пользователей, а это не так.

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

Управление вируализацией

Для определения текущего уровня привилегий пользователя, определения и установки статуса виртуализации есть новые функции (вернее, как новые, так и старые с новыми значениями параметров) WinAPI, но их использование не слишком просто. К тому же, если хочется поддерживать совместимость с версиями системы Windows 2000 и Windows XP, некоторые функции придется загружать динамически.

Виртуализация x86/x64

Это еще одна "ось" виртуализации - по умолчанию, данные для x86 приложений в системах x64 хранятся отдельно. Если требуется, чтобы x86 и x64 версии приложения использовали одни и те же данные, эту виртуализацию следует отключить. К счастью, это делается простой установкой одного из новых флагов функции открытия реестра.

понедельник, 31 марта 2014 г.

Проблемы, возникающие при подготовке Windows-программ для распространения. Часть 0, вводная

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

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

Если же вы - начинающий автор, то перед вами встают следующие вопросы, на которые вы пока не знаете ответа:

  • Как защитить приложение от модификации и неправомерного использования;
  • Как организовать систему лицензирования и активации приложения;
  • Как создать качественный инсталлятор.

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

Не буду описывать муки выбора протектора, вы можете найти немало статей в сети на тему их сравнения (в том числе и нашу, которую мы планируем когда-нибудь потом адаптировать для блога). Мы решили использовать VMProtect, так как для него существует довольно удобный менеджер лицензий/сервер активации WebLM (от того же автора). Скажем только, что защита приложения и система лицензирования - это все-таки разные, хотя и довольно тесно связанные вещи. Некоторые протекторы предоставляют только возможности по защите ПО, некоторые - предоставляют также какие-то свои реализации системы лицензирования и активации. При выборе протектора мы лишь рекомендуем обратить более пристальное внимание на этот аспект.

Как оказалось, несмотря на всю мощь протектора VMProtect и сервера лицензирования WebLM, необходимо выполнить еще довольно много работы по адаптации приложения. Данная работа заняла довольно значительное время, и мы решили выпустить наши наработки отдельным продуктом - VMPKit.

В качестве примера приложения, инсталляция и активация которого выполнена на достаточно высоком уровне, мы хотим привести другой наш продукт - утилиту для работы с буфером обмена Клипборд Коц (Clipboard Stripper). Её инсталлятор и активация выполнены при помощи пакета VMPKit, и она может служить неплохим демонстрационным примером.