Тема: Лицензирование модульного приложения

Добрый день!

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

Вопрос: можно использовать для защиты этой программы таблицу лицензий? Если да, то как наиболее грамотно это сделать? Создавать для каждого модуля свою сессию работы с ключом? Не будет ли это очень медленно?

Re: Лицензирование модульного приложения

Добрый день,

Уточните, пожалуйста, с какими инструментами разработки вы работаете, Guardant SDK или Guardant SLK? Какой версии?
Также уточните, какими ключами вы пользуетесь, программными или аппаратными?

Re: Лицензирование модульного приложения

Мы пользуемся аппаратными ключами Guardant Sign Net, с которыми общаемся самостоятельно через основное API из Guardant SDK.

Re: Лицензирование модульного приложения

Версия GuardantSDK-7_0-update_8.msi

Re: Лицензирование модульного приложения

Добрый день,

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

Рекомендуем рассмотреть такой вариант:

каждый модуль программы — отдельная запись в таблице лицензий;
для каждого модуля задается свое число лицензий;
например: “Линии” = 5, “Круги” = 1.

проверять и занимать лицензию при фактическом использовании модуля;
после завершения работы с модулем освобождать ее;

По производительности - замедление возможно только если слишком часто создавать/закрывать сессии и постоянно обращаться к ключу.

Re: Лицензирование модульного приложения

Хорошо.
А если пользователь загружает готовый файл, который использует сразу 50 модулей? Нужно будет их сразу проверить. Не будет лм сильно тормозить?

Re: Лицензирование модульного приложения

steevis пишет:

Хорошо.
А если пользователь загружает готовый файл, который использует сразу 50 модулей? Нужно будет их сразу проверить. Не будет лм сильно тормозить?

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

Re: Лицензирование модульного приложения

Еще вопрос.
А можно ли с помощью API посмотреть число свободных модулей и кто их занял?

Re: Лицензирование модульного приложения

steevis пишет:

Еще вопрос.
А можно ли с помощью API посмотреть число свободных модулей и кто их занял?

В технологии Guardant SDK такой возможности нет.
Информация о количестве свободных лицензий и о том, кто их занял, доступна на стороне сервера сетевых лицензий, но не через API Guardant SDK.

В современной технологии лицензирования и защиты Guardant Station такая возможность уже реализована.

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

Re: Лицензирование модульного приложения

Теперь вопрос о том, как правильно использовать таблицу лицензий.

У нас программа поставляется по принципу: базис (запуск самой программы и минимального функционала) + модули. Допустим, пользователь купил 5 рабочих мест с базовым функционалом, 5 лицензий на модуль "Линии" и 2 лицензии на модуль "Круги". Таким образом, одновременно 5 рабочих мест запускают программу и рисуют линии, а только 2 из них дополнительно рисуют круги. Правильно ли я понял, что таблица лицензий в этом случае имеет вид:
общий ресурс ключа - 5
модуль 0 (линии) - 5
модуль 1 (круги) - 2 ?

Или для базиса тоже нужно делать свой "модуль"?

Следующий вопрос, как активировать модули в программе. Я так понимаю, что при запуске самой программы (базиса) нужно выполнить GrdLogin с номером модуля 0xffffffff,  а при активации модулей вызвать эту же функцию со значениями 0 и 1. Правильно?

И последнее. Функция GrdLogout закрывает сразу все модули? Если ли возможность освободить только один модуль, не закрывая программы? Например, чтобы пользователь рядом с модулем имел возможность нажать на кнопку "Отключить". Или нужно закрыть все, а потом заново открыть все, кроме одного модуля?

Re: Лицензирование модульного приложения

Еще один технический вопрос.

В процессе работы с ключом каждый запуск GrdLogin создает новый сокет, а все остальные операции (шифрование и т.п.) проводится уже с установленным соединением? Или не так? Хотелось бы примерно понимать картину, чтобы оптимизировать запуск и использование сетевого ключа в отдельных модулях. Могут быть случаи, когда сервер ключей находится в другом городе. Короче, знать, что быстро, а что медленно.

Re: Лицензирование модульного приложения

Добрый день.

steevis пишет:

Теперь вопрос о том, как правильно использовать таблицу лицензий.

У нас программа поставляется по принципу: базис (запуск самой программы и минимального функционала) + модули. Допустим, пользователь купил 5 рабочих мест с базовым функционалом, 5 лицензий на модуль "Линии" и 2 лицензии на модуль "Круги". Таким образом, одновременно 5 рабочих мест запускают программу и рисуют линии, а только 2 из них дополнительно рисуют круги. Правильно ли я понял, что таблица лицензий в этом случае имеет вид:
общий ресурс ключа - 5
модуль 0 (линии) - 5
модуль 1 (круги) - 2 ?

Или для базиса тоже нужно делать свой "модуль"?

Следующий вопрос, как активировать модули в программе. Я так понимаю, что при запуске самой программы (базиса) нужно выполнить GrdLogin с номером модуля 0xffffffff,  а при активации модулей вызвать эту же функцию со значениями 0 и 1. Правильно?

И последнее. Функция GrdLogout закрывает сразу все модули? Если ли возможность освободить только один модуль, не закрывая программы? Например, чтобы пользователь рядом с модулем имел возможность нажать на кнопку "Отключить". Или нужно закрыть все, а потом заново открыть все, кроме одного модуля?

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

Допустим, защищенный программный комплекс состоит из 4-х модулей: MyProg1.exe – Бухгалтерия, MyProg2.exe – Зарплата, MyProg3.exe – Кадры, MyProg4.exe – Канцелярия.

При помощи данной опции можно контролировать использование любого модуля. Для этого необходимо последовательно защитить каждый из модулей с опцией /MN=хх. Если будет использован номер, превышающий количество модулей в таблице лицензий, то при попытке регистрации приложения на сервере Guardant Net будет возвращен код ошибки 10 – Сетевой ресурс программы исчерпан (License counter of Guardant Net exhausted).

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

Защищенные в этом режиме приложения при запуске регистрируются на сервере Guardant Net и занимают определенный ресурс из таблицы лицензий.

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

Номер модуля, который будет выбран для работы определяется параметром функции Login. Номер модуля в таблице LMS, на котором будет регистрироваться копия приложения. Если LMS не используется, параметр должен быть равен 0xFFFFFFFF. Для локальных ключей этот параметр игнорируется.

Re: Лицензирование модульного приложения

Тимофей Ершов пишет:

Функция GrdLogout закрывает сразу все модули?

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

Если сеанс был открыт с удаленным ключом, в процессе выполнения функции происходит возврат лицензии (увеличение на 1 счетчика лицензий) серверу Guardant Net и таблице лицензий LMS, с которыми работало приложение.

Вся информация об этой копии приложения в памяти сервера Guardant Net будет уничтожена. Возврат лицензии серверу осуществляется в том же режиме, что и производился захват. То есть учитывается режим выдачи лицензий рабочим станциям или копиям приложения. С этого момента получить доступ к ключу приложение может, только снова выполнив функцию GrdLogin.
Закрывается сессия по Handle

int GRD_API GrdLogout( 
  HANDLE hGrd,
  DWORD dwMode
); 

Re: Лицензирование модульного приложения

steevis пишет:

В процессе работы с ключом каждый запуск GrdLogin создает новый сокет, а все остальные операции (шифрование и т.п.) проводится уже с установленным соединением?

Да. После успешного вызова GrdLogin приложение получает доступ к операциям с ключом через открытый дескриптор grdHandle. Далее уже выполняются прочие операции (работа с аппаратными алгоритмами, защищенными ячейками и пр...).
То есть типовой сценарий такой: проверка/поиск ключа, выполнение Login, затем работа с доступными функциями ключа в рамках текущего открытого handle.

steevis пишет:

Могут быть случаи, когда сервер ключей находится в другом городе.

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

Re: Лицензирование модульного приложения

Добрый день!

Спасибо за информацию. И все-таки я не понял главного, о чем писал с самого начала. У меня НЕ несколько exe-файлов, а ОДИН. Единое приложение. В нем необходимо включать отдельные функциональные возможности (условно, кнопки с рисованием линий, кругов и т.д.). Вопрос о том, как это сделать с помощью API.

Можно ли при запуске программы сделать один вызов GrdStartup, затем найти ключ с помощью GrdFind, а потом несколько раз вызывать GrdLogin с различными номерами модулей? А после выхода из программы один раз сделать GrdLogout.
Или нужно при начале работы пользователя с модулем (в этом же exe-файле !!!) делать новый GrdStartup, опять искать ключ и логиниться в новом хендле с новым номером модуля?
Или вообще так делать нельзя?

Re: Лицензирование модульного приложения

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

инициализацию Guardant API (GrdStartup) выполнять один раз при запуске приложения;
поиск ключа (GrdFind) также выполнять один раз после инициализации;
доступ к отдельным функциям приложения проверять отдельными вызовами GrdLogin для соответствующих номеров модулей;
завершение доступа выполнять отдельным вызовом GrdLogout для каждого успешного GrdLogin.
Необходимости повторно выполнять GrdStartup и GrdFind при переходе пользователя к работе с другим модулем в рамках того же exe-файла, как правило, нет.

Re: Лицензирование модульного приложения

Спасибо!

Картинка начинает выкристаллизовываться...

Особенность в том, что модули должны работать ПАРАЛЛЕЛЬНО друг с другом в приложении. То есть пользователь активировал рисование кругов и не выключает его. Потом включил линии, а круги все так же остались.

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

Насколько я понимаю, нам нужно сделать несколько логинов, работающих параллельно. Каждый логин будет соответствовать своему модулю. Как поступить в этом случае?

Можно ли так:

1. При запуске программы один раз делаем GrdStartup и GrdFind.
2. Тут же создаем новый хэндл и в нем делаем GrdLogin для нулевого модуля (базового, связанного с запуском самой программы). Если все лицензии нулевого модуля заняты, то выходим из программы.
3. При начале работы пользователя с каким-либо другим модулем (номер 1, 2 и т.д.) создаем новый хэндл с помощью GrdCreateHandle и логинимся в нем. Если все лицензии этого модуля заняты, то отказываем пользователю в использовании этого модуля, но продолжаем работу самой программы и других ранее подключенных модулей.
4. Если пользователь нажал на кнопку "Отключить модуль N", то для этого модуля вызываем GrdCloseHandle, которая выполняет GrdLogout и высвобождает лицензию на этот модуль для других сетевых пользователей.
5. Если пользователь завершает работу программы, то для нулевого и всех оставшихся подключенных модулей вызываем GrdCloseHandle, а потом и GrdCleanup.

Будет работать?