Менеджер "плавающих" лицензий для игр

Менеджер "плавающих" лицензий для игр необходимо использовать для запуска игр, которые требуют лицензирования и когда количество купленных вами лицензий меньше общего числа машин в сети.
Таким образом, в данную игру смогут одновременно играть не более N-машин из общего числа, однако сами эти машины могут быть каждый раз разными и таким образом лицензии будут "перемещаться" от одной машины к другой при запуске.
Если же все лицензии игры "разобраны" разными машинами и свободных в данный момент нет, то при запуске игры пользователю будет выдано соотв. сообщение и запуска игры на его машине не произойдет.
Принцип работы
Для каждой игры, которая требует лицензирования, создается на сервере .ini-файл с лицензиями. Сколько таких игр, столько будет и файлов (исключение для steam-игр, см. ниже).
Далее в настройках ярлыка такой игры необходимо установить путь относительно СЕРВЕРА к соотв. ini-файлу в параметре "Плавающая лицензия". Путь должен быть доступен с сервера, т.к. именно сервер (а не клиент!) будет считывать файл. Если программа администратора также находится на сервере, то файл можно выбрать через окошко обзора файлов, а иначе - вписать путь вручную.
При запуске игры произойдет передача на сервер запроса, а сервер, в свою очередь, опросит все машины на предмет запуска в данный момент времени конкретной игры, и, если имеется свободная лицензия, то она будет возвращена на клиентскую машину ввиде переменной окружения %FLOATLIC%, после чего происходит запуск игры.
Использовать данную переменную окружения можно по-разному, т.к. все зависит от конкретной игры и как именно в этой игре организовано лицензирование. Например, для некоторых игр достаточно передать логин/пароль в командную строку, для других - записать лицензию в реестр или определенный файл. Таким образом, строка %FLOATLIC% может представлять разные значения.
Формат ini-файла
Для каждой такой игры должен быть создан на сервере свой отдельный файл.
Все данные находятся в одной секции [Main]:

    ;-----------------------
    [Main]
    Name=название_игры
    Exe=[exe_file1[,exe_file2[,...]]]
    Steam=[1 или 0]
    Server=[сервер[:порт]]
    Keep=[время_в_сек]
    ExeDelayLoad=[время_в_сек]
    DoNotAsk=[1 или 0]
    Lic0=лицензия_1
    Lic1=лицензия_2
    Lic2=лицензия_3
    ....
    LicN=лицензия_N+1
    ;-----------------------

Параметр Name определяет название игры. Он должен быть указан обязательно и для каждой игры быть своим уникальным.
Параметр Exe является необязательным и его нужно указывать только для тех игр, которые запускаются через постоянно запущенную программу (например, для Steam). В случае со Steam'ом базовый файл steam.exe остается всегда запущен в системе, а различные игры запускаются через него, потому отследить, запущена ли игра в данный момент или нет, однозначно нельзя. В таких случаях необходимо в параметре Exe указать один или несколько exe-файлов игры. Если хотя бы один из этих файлов работает в данный момент, то считается, что и игра запущена. Можно указывать только имена файлов без пути, а можно и с полным путем (также допускается использование переменных окружения %переменная% и масок "*", "?").
Примеры:
Exe=game.exe
Exe=%ProgramFiles%\game\game.exe
Exe=%ProgramFiles%\game\game_e1.exe,%ProgramFiles%\game\game_e2.exe
LicN (где N от 0 до 999) определяет N-ую купленную вами лицензию для данной игры. Если у вас куплено 10 лицензий, то должно быть 10 строк от Lic0 до Lic9
Сама строка лицензии может представлять что угодно в зависимости от самой игры (общего подхода здесь нет).
Параметр Steam нужно использовать только для пакетных Steam-игр (указать Steam=1).
Если у вас куплено N-лицензий Steam, а из пакета Steam пользователи могут запускать множество игр, то при таком сценарии необходимо создать лишь один файл на сервере (например, steam.ini) и установить его как плавающую лицензию для всех ярлыков Steam-игр. Суть параметра Steam=1 заключается в том, чтобы закрывать автоматически Steam-сессию на той клиентской машине, которая в данный момент не использует Steam-игру, но "держит" лицензию. Шелл будет автоматически закрывать такую сессию при необходимости ее освобождения.
Также необходимо обязательно перечислить в параметре Exe= все игры, которые у вас запускаются через стим (полные пути или только имена exe-файлов игр через запятую).
Каждая Steam-игра должна запускаться так:
Файл запуска ярлыка: %ProgramFiles%\Steam\Steam.exe
Аргументы командной строки: -login %FLOATLIC% -language russian -applaunch <id> [аргументы_для_игры]
В аргумент %FLOATLIC% будет передаваться купленный логин/пароль (через пробел) из параметров LicX вашего файла steam.ini;
Аргумент id обозначает идентификатор Steam-игры;
аргументы_для_игры - необязательные параметры, которые будут передаваться в саму игру.
Пример для Steam-пакета см. ниже.
Параметр Server нужно использовать только в том случае, если у вас есть модуль плавающих лицензий для сети клубов (приобретается отдельно), он служит для распределения лицензий между клубами и должен быть установлен на одном глобальном сервере, к которому каждая клиентская машина любого клуба могла бы иметь доступ (через TCP-протокол).
Если необходимо распределять ограниченное число лицензий между клубами, то .ini-файл плавающей лицензии для какой-либо игры должен быть одинаковым на всех локальных серверах клубов, или можно его держать в одном экземпляре на глобальном сервере, но в этом случае сервера клубов должны иметь доступ через сеть к этому файлу (в ярлыках тогда указывать \\global_server\...\file.ini). Напомним, что чтение .ini-файла ведет локальный сервер клуба, а не клиентская машина! В качестве параметра Server необходимо указать IP или DNS-имя глобального сервера и опционально порт связи. Если порт не указать, то будет использоваться стандартный HTTP 80.
Если связи с глобальным сервером нет по какой-то причине, то менеджер переходит в режим работы без сервера (так, как будто бы сервер не указан в параметре Server) в пределах одного клуба.
Параметр Keep нужно использовать для резервирования выбранной лицензии на N-секунд после первого старта. Например, пользователь получил лицензию номер 2 и после обновления игры ему нужно произвести перезагрузку машины, а затем далее продолжить с этой же лицензией и быть уверенным, что ее не "захватит" кто-то другой за время его перезагрузки. В этом случае можно указать время в секундах, в течение которого лицензия будет занята под этого пользователя. Если указать время меньшее 60 сек, то будет считаться что указано 60 сек.
Внимание! Данный параметр лучше использовать только если используется глобальный сервер (установлен параметр Server).
Параметр ExeDelayLoad обычно используют совместно со steam и служит для случаев когда игра может запуститься позже на N-секунд после старта steam (например, несколько минут может уйти на его обновление и лишь потом запустится игра), в этом случае в течение N-секунд после старта лицензия не будет освобождена несмотря на то, что сам exe-файл игры может быть еще не запущен.
Параметр DoNotAsk можно установить в 1 чтобы не выдавать запрос на выбор свободной лицензии из списка (в этом случае она будет выбираться автоматически).
Внимание! Механизм плавающих лицензий имеет свою инерционность. Т.е., если пользователь закрыл лицензированное приложение, то лицензия может освободиться не сразу, а с интервалом от 1 до 60 сек!
Далее на вымышленных примерах можно рассмотреть возможные варианты использования строк лицензий.
Пример 1.
Лицензии для игры передаются ввиде параметров командной строки: -login XXX -password YYY

    ;-----------------------
    [Main]
    Name=Игра 1
    Lic0=-login 7658675 -password 219356
    Lic1=-login 2341799 -password 128702
    ;-----------------------

В аргументах командной строки ярлыка игры достаточно просто указать:
%FLOATLIC%
Пример 2.
Лицензия для игры должна храниться в файле lic.dat в папке игры. Купленные файлы хранятся на сервере в папке \\server\game2\lic

    ;-----------------------
    [Main]
    Name=Игра 2
    Lic0=lic1.dat
    Lic1=lic2.dat
    ;-----------------------

В скрипте до старта программы необходимо указать:
copy /Y \\server\game2\lic\%FLOATLIC% c:\game2\lic.dat
Пример 3.
Лицензия для игры должна храниться в реестре. А на сервере лежат подготовленные .reg-файлы

    ;-----------------------
    [Main]
    Name=Игра 3
    Lic0=lic1.reg
    Lic1=lic2.reg
    ;-----------------------

В скрипте до старта программы необходимо указать:
reg IMPORT \\server\game3\lic\%FLOATLIC%
(при этом необходимо не забыть убрать запрет на редактирование реестра в настройках "Безопасность: Система")
Пример 4.
Установку лицензии для игры делает ваш скрипт или программа, нужно ее запустить с командной строкой.

    ;-----------------------
    [Main]
    Name=Игра 4
    Lic0=987693475
    Lic1=127629782
    ;-----------------------

В скрипте до старта программы необходимо указать ваш скрипт/программу:
start /WAIT c:\myprog.exe %FLOATLIC%
Пример 5.
Необходимо просто ограничить одновременный запуск игры/программы не более чем в N-экземплярах в сети, а самих лицензий как таковых нет.

    ;-----------------------
    [Main]
    Name=Игра 5
    Lic0=1
    Lic1=1
    ...
    LicN=1
    ;-----------------------

В этом случае нельзя будет запустить более N+1 копий игры в сети.
Пример 6.
Steam-пакет (этот один файл устанавливается для всех Steam-игр):

    ;-----------------------
    [Main]
    Name=Steam
    Steam=1
    Exe=quake3.exe,quake.exe,hl.exe,doom3.exe
    Lic0=login1 password1
    Lic1=login2 password2
    ...
    LicN=loginN passwordN
    ;-----------------------

См. выше более подробное описание параметра Steam
Также примеры могут быть и более сложными.