ПРОГРАММНЫЙ ИНТЕРФЕЙС ДЛЯ ЛИЦЕНЗИРОВАНИЯ
LICENSING PROGRAM INTERFACE

Область техники, к которой относится изобретение
Настоящее изобретение относится к области компьютерного программного обеспечения, или более точно, к программным интерфейсам, которые поддерживают принудительное исполнение условий электронных лицензий.
Уровень техники
Коммерческие программные продукты традиционно предоставляются на условиях лицензионных соглашений, которые определяют допустимые границы использования этих программных продуктов. В начале возникновения практики лицензирования программного обеспечения лицензионный договор обычно имел форму юридического документа, который определял права пользователя по отношению к программному продукту. При этом необходимость исполнения условий таких лицензионных соглашений основывалась только на законодательстве. В настоящее время появилась потребность в том, чтобы контролировать исполнение условий лицензионных соглашений на электронном уровне, то есть необходимо, чтобы компьютерные программы содержали код, который активно препятствует или предотвращает использование программного продукта какими-либо способами, запрещенными лицензионным соглашением.
Большинство программных продуктов, которые поддерживают принудительное исполнение условий электронных лицензий, имеют свои собственные средства для управления лицензированием этих программных продуктов и использованием лицензий. Так, типичный коммерческий программный продукт может включать не только код, выполняющий основные функции программного продукта, но также и код для получения, оценки, защиты и управления лицензиями данного программного продукта. Для каждого производителя программного обеспечения разработка и реализация подобных средств зачастую является излишней дублирующей работой. Поэтому желательно разработать систему, которая бы предоставляла базовые функции, связанные с лицензированием программных продуктов, и которая могла бы использоваться большим разнообразием программных продуктов единым и четко определенным способом.
Из изложенного выше следует, что существует потребность в механизме, который позволит преодолеть недостатки предшествующих технологий.
Раскрытие изобретения
Данное изобретение предлагает интерфейс прикладного программирования (API), поддерживающий электронное лицензирование, который предоставляет определенные поддерживающие лицензирование функции для использования программными продуктами. Сервис лицензий выполняет функции, относящиеся к использованию лицензий, и предоставляет программным продуктам доступ к этим функциям через API. Сервис лицензий выполняет функции, такие как получение лицензий, хранение и управление лицензиями, защита лицензий от подделок, оценка того, что лицензии имеют силу, и оценку того, что лицензии корректно привязаны к машине и/или программному продукту, на которой они используются. Программы могут использовать эти функции посредством вызова методов из API.
При типичном использовании API программа вызывает API метод "открыть", чтобы получить уникальный описатель (handle), который используется сервисом лицензий, чтобы идентифицировать эту программу. Затем программа вызывает API метод "использовать право". "Использовать" в данном контексте подразумевает применение определенного права. При вызове метода "использовать право" в качестве параметров ему передается описатель программы и имя соответствующего права, которое нужно использовать. Затем сервис лицензий пытается найти одну или более имеющих силу, корректно привязанных лицензий, которые содержат право с данным именем. Если таких лицензий нет, то программе сообщается о неудаче. Если такие лицензии существуют, то это право привязывается к одной из них и вызывающая программа получает сообщение об этой привязке. В этом случае программа знает, что соответствующее право существует и может выполнять функции, ассоциированные с этим правом.
В предпочтительном воплощении сервис лицензий не определяет, какие функции программа может или не может выполнять согласно какому-либо праву, а также не накладывает существенных ограничений на использование программы. Предпочтительно, если сервис лицензий будет управлять лицензиями таким образом, что, вызывая API, программы будут получать информацию о том, существует право или нет, и в соответствии с этим сами будут выбирать дальнейшее поведение. Например, может существовать право "запустить", означающее, что пользователь имеет право запускать программу. Тогда программа может использовать API, чтобы определить имеется ли действительное (и корректно привязанное, и с неистекшим временем использования) право на запуск программы. Однако если вызов API вернул сообщение, что не существует права запускать программу, программа сама решает отклонить выполнение или совершить какое-либо другое действие, основанное на том, что данное право не существует.
Право может быть связано с информацией, которая становится доступной после успешного вызова метода "использовать право". Например, программа может иметь отдельные правила о том, когда разрешено редактировать, печатать, сохранять и т.д., и эти правила могут храниться в лицензии, содержащей соответствующее право. API предоставляет метод "получить информацию", который позволяет извлекать такую информацию из лицензий.
Другие отличительные особенности изобретения описаны ниже.
Краткое описание чертежей
Предшествующее краткое описание, так же как и последующее подробное описание предпочтительных воплощений, легче понимать, если при чтении пользоваться прилагаемыми чертежами. Для иллюстрации изобретения, на чертежах показаны примеры реализации изобретения; однако изобретение не ограниченно этими частными методами и средствами. На чертежах:
Фиг.1 - структурная схема примера вычислительной среды, в которой может быть реализовано изобретение.
Фиг.2 - структурная схема архитектуры, в которой система выполняет функции лицензирования и предоставляет API программным продуктам.
Фиг.3 - блок-схема способа, посредством которого программа использует API лицензирования.
Фиг.4 - блок-схема способа, посредством которого программа использует право; и
Фиг.5 - блок-схема способа, посредством которого программа получает информацию, относящуюся к используемому праву.
Осуществление изобретения
Обзор
Использование коммерческого программного обеспечения обычно определяется лицензиями, и сейчас стало широко распространено реализовывать такие лицензии в электронной форме, которая может использоваться программным обеспечением для поддержки принудительного исполнения условий лицензии. Для создания системы электронного лицензирования необходимы средства, управляющие использованием лицензий. Дублирование этих средств в каждом программном продукте обременительно и неэкономно. Настоящее изобретение предлагает API, который позволяет различным программным продуктам использовать общую инфраструктуру средства, которая выполняет различные функции, связанные с лицензированием.
Пример вычислительной конфигурации
Фиг.1 показывает пример вычислительной среды, в которой может быть реализовано настоящее изобретение. Эта вычислительная среда 100 является только примером подходящей вычислительной среды и не имеет целью указать какие-либо ограничения на область применения или функциональные возможности настоящего изобретения. Не следует также считать, что вычислительная среда 100 имеет какую-либо зависимость от или требования к какому-либо компоненту или комбинации компонентов, показанных на этом примере вычислительной среды 100.
Изобретение применимо к множеству других общего или специального назначения сред вычислительных систем или конфигураций. Примеры хорошо известных вычислительных систем, сред, и/или конфигураций, которые подходят для использования с изобретением, включают, но не сводятся только к ним: персональные компьютеры, серверные компьютеры, ручные или портативные устройства, многопроцессорные системы, микропроцессорные системы, телевизионные приставки, программируемая потребительская электроника, сетевые персональные компьютеры, миникомпьютеры, универсальные вычислительные машины (mainframe computers), встроенные системы, распределенные вычислительные среды, которые включают в себя любые из вышеперечисленных систем или устройств, и тому подобное.
Изобретение может быть описано в общем контексте машиноисполнимых команд, таких как программные модули, исполняемые компьютером. В общем, программные модули включают процедуры, программы, объекты, компоненты, структуры данных, и т.д., которые выполняют определенные задачи или реализуют определенные абстрактные типы данных. Изобретение может также применяться в распределенных вычислительных средах, где задачи выполняются удаленными обрабатывающими устройствами, которые взаимосвязаны посредством сети связи или посредством других средств передачи данных. В распределенных вычислительных средах программные модули и другие данные могут находиться как на локальных, так и на удаленных компьютерных средствах хранения информации, включающих в себя запоминающие устройства.
На Фиг.1 изображен пример системы для реализации изобретения. Эта система включает в себя вычислительное устройство общего назначения в форме компьютера 110. Компоненты компьютера 110 могут включать в себя, но не в ограничительном смысле: процессорное устройство 120, системную память 130 и системную шину 121, которая связывает различные компоненты системы, в том числе системную память и процессорное устройство 120. Процессорное устройство 120 может состоять из нескольких логических процессорных устройств, например таких, которые поддерживаются на многопоточных процессорах. Системная шина 121 может иметь структуру различных типов, в том числе шину памяти или контроллер памяти, периферийную шину и локальную шину, имеющие любые виды архитектур. В качестве примера, но не ограничения, такие архитектуры включают в себя шины стандартной промышленной архитектуры (ISA), шины микроканальной архитектуры (MCA), шины расширенной архитектуры ISA (EISA), локальные шины стандарта VESA (Ассоциация по стандартам в области видеоэлектроники), шины соединения периферийных устройств (PCI), также известные как шины расширения (Mezzanine bus). Системная шина 121 может также быть реализована как двухточечное соединение, коммутируемая структура (switching fabric) и другими подобными коммуникационными устройствами.
Компьютер 110 обычно содержит набор читаемых компьютером носителей информации. Читаемые компьютером носители информации могут быть любыми носителями информации, к которым может обращаться компьютер 110, и они включают в себя как энергозависимые, так и энергонезависимые носители информации, как съемные, так и стационарные носители информации. В качестве примера, но не ограничения, компьютерные носители информации могут включать в себя компьютерные носители информации и средства связи. Компьютерные носители информации включают как энергозависимые, так и энергонезависимые носители, как съемные, так и стационарные носители, реализованные любым методом или технологией для хранения информации, такой как машинные команды, структуры данных, программные модули или другие данные. Компьютерные носители информации включают в себя, но не в ограничительном смысле, оперативное запоминающее устройство (ОЗУ, RAM), постоянное запоминающее устройство (ПЗУ, ROM), электрически-стираемое программируемое ПЗУ (EEPROM), флэш-память или другую технологию памяти, постоянное запоминающее устройство на компакт-диске (CDROM), универсальный цифровой диск (DVD) или другие оптические дисковые накопители, магнитные кассеты, магнитную ленту, магнитный дисковый накопитель или другие магнитные запоминающие устройства, или любые другие средства, которые могут применяться для хранения необходимой информации, к которым компьютером 110 может быть осуществлен доступ. Средства связи обычно реализуют машинные команды, структуры данных, программные модули или другие данные в виде модулированных сигналов данных, таких как несущая или другой транспортный механизм, и включают в себя любые средства доставки информации. Термин "модулированный сигнал данных" означает сигнал, у которого одна или более характеристик установлены в определенное состояние или изменены таким образом, чтобы закодировать информацию в этом сигнале. В качестве примера, но не ограничения, средства связи включают в себя проводные средства, такие как проводные сети или прямые проводные соединения, и беспроводные средства, такие как акустические, высокочастотные (RF), инфракрасные и другие беспроводные средства. Комбинации всего вышеперечисленного следует также включить в область компьютерных носителей информации.
Системная память 130 включает в себя компьютерные запоминающие средства в форме энергозависимой и/или энергонезависимой памяти, такие как постоянное запоминающее устройство (ROM) 131 и оперативное запоминающее устройство (RAM) 132. Базовая система ввода/вывода 133 (BIOS), содержащая базовые процедуры, которые помогают передавать информацию между элементами внутри компьютера 110, например, в процессе запуска, обычно храниться в ROM 131. RAM 132 обычно содержит данные и/или программные модули, которые непосредственно доступны и/или в текущий момент обрабатываются процессорным устройством 120. В качестве примера, но не ограничения, Фиг.1 показывает операционную систему 134, прикладные программы 135, другие программные модули 136 и программные данные 137.
Компьютер 110 также может включать в себя другие съемные/стационарные, энергозависимые/энергонезависимые компьютерные запоминающие средства. В качестве примера, но не ограничения, Фиг.1 показывает накопитель на жестких дисках 140, который считывает с или записывает на стационарный энергонезависимый магнитный носитель, дисковод магнитных дисков 151, который считывает с или записывает на съемный энергонезависимый магнитный диск 152, и дисковод оптических дисков 155, который считывает с или записывает на съемный энергонезависимый оптический диск 156, такой как CD ROM (постоянное запоминающее устройство на компакт-диске) или другие оптические средства. Другие съемные/стационарные, энергозависимые/энергонезависимые компьютерные запоминающие средства, которые могут быть использованы в примере операционной среды, включают в себя, но не в ограничительном смысле, кассеты с магнитной лентой, платы (карты) с флэш-памятью, цифровые универсальные диски, цифровую видеоленту, твердотельные RAM, твердотельные ROM и т.п. Накопитель на жестких дисках 141 обычно присоединен к системной шине 121 посредством интерфейса стационарной памяти, такого как интерфейс 140, а дисковод магнитных дисков 151 и дисковод оптических дисков 155 обычно присоединены к системной шине 121 посредством интерфейса съемной памяти, такого как интерфейс 150.
Дисководы, накопители и связанные с ними компьютерные запоминающие средства, рассмотренные выше и показанные на Фиг.1, позволяют хранить машинные команды, структуры данных, программные модули и другие данные для компьютера 110. Например, на Фиг.1 показано, что на жестком диске 141 хранятся операционная система 134, прикладные программы 135, другие программные модули 136 и программные данные 137. Операционная система 144, прикладные программы 145, другие программные модули 146 и программные данные 147 обозначены на чертеже другими ссылочными позициями, чтобы показать, что, как минимум, они являются другими копиями. Пользователь может вводить команды и информацию в компьютер 20 посредством устройств ввода, таких как клавиатура 162 и указательное устройство 161, которое обычно является мышью, шаровым манипулятором или сенсорной панелью. Другими устройствами ввода (не показаны) могут быть микрофон, рычажный указатель (джойстик), игровой планшет, спутниковая параболическая антенна, сканнер и другие. Эти и другие устройства ввода часто присоединяются к процессорному устройству 120 с помощью интерфейса пользовательского ввода 160, который присоединен к системной шине, но могут подсоединяться с помощью других интерфейсов или каналов передачи информации (шин) другой структуры, таких как параллельный порт, игровой порт или универсальная последовательная шина (USB). Монитор 191 или устройство отображения другого типа также подсоединены к системной шине 121 через интерфейс, такой как видеоинтерфейс 190. В дополнение к монитору компьютеры могут также включать в себя другие периферийные устройства вывода, такие как громкоговорители 197 и принтер 196, которые могут быть подсоединены через периферийный интерфейс вывода 195.
Компьютер 110 может работать в сетевой среде, использующей логические соединения с одним или более удаленными компьютерами, такими как удаленный компьютер 180. Удаленный компьютер 180 может быть персональным компьютером, сервером, маршрутизатором, сетевым персональным компьютером, равноправным устройством или другой обычным сетевым узлом и обычно содержит многие или все элементы, описанные выше касательно компьютера 110, хотя на Фиг.1 показано только запоминающее устройство 181. Логические соединения, показанные на Фиг.1, включают в себя локальную сеть (LAN) 171 и глобальную сеть (WAN) 173, но могут также включать в себя другие сети. Такие сетевые среды являются обычным явлением в учреждениях, компьютерных сетях масштаба предприятия, во внутренних сетях (intranets) и в Интернете.
Когда компьютер 110 используется в среде локальной сети, он подсоединяется к локальной сети LAN 171 посредством сетевого интерфейса или адаптера 170. Когда компьютер 110 используется в среде глобальной сети, он обычно имеет модем 172 или другие средства для установки соединения через глобальную сеть WAN 173, такую как Интернет. Модем 172, который может быть внутренним или внешним, может подсоединяться к системной шине 121 посредством интерфейса пользовательского ввода 160 или другого подходящего механизма. В сетевой среде программные модули, изображенные в связи с компьютером 110 или его частями, могут храниться на удаленном запоминающем устройстве. В качестве примера, и не ограничения, FIG. 1 показывает удаленные прикладные программы 185, постоянно находящиеся на запоминающем устройстве 181. Важно принять во внимание, что показанные сетевые соединения являются лишь примерами и для установления линий каналов связи между компьютерами могут быть использованы другие средства.
Сервис лицензирования программного обеспечения
На Фиг.2 показан пример системы, которая предоставляет сервис 202 лицензирования программного обеспечения. Сервис 202 лицензирования программного обеспечения функционирует внутри компьютера 110 (показанного на Фиг.1). В одном примере сервис 202 лицензирования программного обеспечения является частью операционной системы, которая выполняется на компьютере 110. Сервис лицензирования программного обеспечения имеет хранилище 204 лицензий, в котором хранятся файлы лицензий для программных продуктов. Файлы лицензий могут, например, быть файлами, написанными на языке расширяемый язык описания прав XrML (eXtensible Rights Markup Language), в которых описаны права в отношении программных продуктов, и в которых также могут описываться различные типы условий в отношении применения этих прав. Программные средства 204 также содержат доверенное хранилище 206. Доверенное хранилище 206 сохраняет информацию, на которую невозможно влиять напрямую, и которая является динамически сохраняемыми данными, защищенными от несанкционированного вмешательства; доверенное хранилище 206 сохраняет информацию, которая используется в процессе проверки действительности лицензии. Например, определенные лицензии могут иметь срок окончания действия, и для того чтобы не дать обойти это условие с помощью перевода часов назад, можно периодически записывать текущее время (и истекшее время) в доверенное хранилище 206, чтобы знать, что часы все время идут вперед.
Сервис 202 лицензирования программного обеспечения управляет хранилищем 204 лицензий и доверенным хранилищем 206, а также выполняет различные функции, связанные с лицензированием программных продуктов. Например, сервис 202 лицензирования программного обеспечения может содержать модули, которые анализируют файлы лицензий, модули, которые контролируют привязку лицензий к конкретной машине и/или к конкретным копиям программных продуктов и к надежному таймеру/счетчику (который использует доверенное хранилище 206 способом, описанным выше).
Сервис 202 лицензирования программного обеспечения предоставляет интерфейс 208 прикладного программирования (API), который позволяет прикладным программам (таким как приложение 135) пользоваться сервисом 202 лицензирования программного обеспечения. Приложение 135 может использовать возможности сервиса 208 лицензирования программного обеспечения посредством обращения к методам из API 208, используя локальный вызов процедуры (LPC, local procedure call). Пример набора API методов, которые могут предоставляться сервисом 202 лицензирования программного обеспечения, описывается ниже.
Способ использования API 208 приложениями описывается с использованием Фиг.3. Сначала приложение выполняет API вызов (302). Затем сервис 202 обрабатывает (304) этот API вызов и возвращает результат этого API вызова приложению 306. Например, API вызов может запросить применить ("использовать") какое-либо право, содержащееся в лицензии, или запросить извлечь информацию из лицензии. Приложение затем получает результат API вызова и определяет, основываясь на этом результате, какое следует выбрать поведение (308). Другими словами, в предпочтительном воплощении, сервис 202 лицензирования программного обеспечения не навязывает непосредственно принудительное исполнение условий лицензии, а скорее предоставляет средства, с помощью которых лицензии могут быть организованны и использованы. Например, если приложение выполняет API вызов, чтобы использовать какое-либо право, и сервис 202 определяет, что не существует действительной лицензии, дающей это право, то сервис 202, в предпочтительном воплощении, не препятствует работе приложения, а вместо этого информирует это приложение, что соответствующее право не существует. Таким образом, приложение может использовать свои собственные механизмы, чтобы определить, что делать в ответ на то, что право не существует. Это свойство описываемого API предоставляет производителям программного обеспечения гибкость в решении как следует использовать средства лицензирования, предоставляемые сервисом 202. В другом воплощении приложение может зависеть от функциональности сервиса лицензий.
Пример API для лицензирования программного обеспечения
Ниже следует пример набора API методов, которые могут предоставляться сервисом лицензирования программного обеспечения (SL):
SLOpen
Функция SLOpen открывает описатель контекста клиента сервиса лицензий (SL клиента), который должен использоваться во всех дальнейших SL API вызовах (Во всем описании примера API SL указывает на сервис лицензирования программного обеспечения. Так описатель контекста SL клиента - это описатель, используемый клиентом при каждом обращении к сервису лицензирования программного обеспечения).
HRESULT
SLOpen(
CONST GUID* pguidApp,
HSLC* phSLC
);
Параметры
pguidApp
[вход] Указатель на GUID (глобально уникальный идентификатор) приложения, который однозначно идентифицирует приложение. Если этот аргумент равен NULL, то возвращается ошибка E_INVALIDARG.
phSLC
[выход] Описатель контекста SL клиента или INVALID_HANDLE_VALUE в случае неудачи.
Замечания
Чтобы закрыть описатель контекста, возвращенный функцией SLOpen, надо использовать SLClose.
GUID приложения - это уникальный ID (идентификатор) приложения. В наборе программ MICROSOFT OFFICE версии для WINDOWS, WinWord имеет GUID приложения, отличающийся от GUID приложения, принадлежащего Excel. Для Windows, Windows само является приложением, хотя оно является комбинацией из многих программ.
Пользователь может установить одновременно продукт Office и отдельный продукт WinWord на одной машине. С точки зрения сервиса лицензий программа WinWord в обоих продуктах имеет один и тот же GUID приложения. GUID приложения программы WinWord ассоциирован с двумя GUID продуктов. Другими словами, WinWord может использовать либо лицензию продукта Office, либо лицензию продукта WinWord.
При успешном вызове SLOpen:
Устанавливается RPC связывание. (RPC - удаленный вызов процедуры).
Сервисом лицензий выделяется память для контекста. Этот контекст используется, чтобы хранить информацию о состоянии вызывающего клиента.
Описатели контекста SL клиентов аналогичны описателям файлов. Процесс может открывать множество описателей контекста SL клиента, но описатели имеют смысл только в вызывающем процессе.
Возвращает
Успех или неудачу.
SLClose
Функция SLClose закрывает открытый описатель контекста SL клиента. Любая информация в контексте автоматически сбрасывается.
HRESULT
SLClose(
HSLC hSLC
);
Параметры
hSLC
[вход] Описатель текущего описателя контекста SL клиента.
Замечания
Когда SLClose завершается, RPC связывание сбрасывается и соответствующий контекст разрушается.
Возвращает
Успех или неудачу.
SLInstall
Функция SLInstall устанавливает лицензии приложений и регистрирует информацию приложений.
HRESULT
SLClose(
HSLC hSLC,
CONST SL_PRODKEY* pAppPrdKey,
DWORD dwNumOfApps,
CONST GUID* pguidApps,
DWORD dwNumOfLicFiles,
PCWSTR ppszLicFiles[],
BOOL bVerify
);
Параметры
hSLC
[вход] Описатель текущего описателя контекста SL клиента.
pAppPrdKey
[вход] Структура ключа программного продукта. Ключ программного продукта может иметь формат ключа продукта Майкрософт (MS) или формат ключа, определяемый приложением.
Typedef struct _tagSL_PRODKEY
{
DWORD cbSize; // Размер структуры SL_PRODKEY
DWORD dwVersion; // Версия структуры SL_PRODKEY
WCHAR szProdKey[MAX_PRODKEYSTR_SIZE+1];
SL_PRODKEY_TYPE eProdKeyType; // Тип ключа программного продукта
SL_CUSTOM_PRODKEY_INFO CustomPrdKeyInfo; // Информация о ключе продукта
} SL_PRODKEY;
Величина eProdKeyType может иметь одно из следующих значений:
SL_PRODKEY_CUSTOM
SL_PRODKEY_MS2002
SL_PRODKEY_MS2003
Если тип ключа продукта не является MS ключом продукта (то есть eProdKeyType=SL_PRODKEY_CUSTOM), то вызывающее приложение должно предоставить информацию о ключе продукта. Если приложение использует ключ продукта MS типа, то параметр CustomPrdKeyInfo можно игнорировать.
Typedef struct _tagSL_CUSTOM_PRODKEY_INFO
{
DWORD dwSKUID; // Уникальный ID для определенного SKU, например ID группы в MS PID.
DWORD dwSerialNumber; // Уникальный серийный номер, например, канал+последовательный номер в MS PID.
} SL_CUSTOM_PRODKEY_INFO;
Для SL_PRODKEY текущий номер версии равен 1. Вызывающая программа может использовать SL_CURRENT_PRODKEY_VERSION в поле dwVersion.
dwNumOfApps
[вход] Количество GUID приложений в pguidApps.
pguidApps
[вход] Список GUID приложений. GUID приложения представляет приложение, для которого устанавливается лицензия. Например, программа для установки Office может вызывать эту функцию, чтобы установить лицензию/лицензии для Word, Excel, указывая каждый GUID приложения в pguidApps. pguidApps не может здесь равняться NULL.
dwNumOfApps
[вход] Количество файлов лицензий.
ppszLicFile
[вход] Имена файлов в массиве строк.
Возвращает
Успех или неудачу.
SLUninstall
Функция SLUninstall удаляет лицензию продукта из приложения.
HRESULT SLUninstall (
HSLC hSLC,
CONST SL_PRODKEY* pAppPrdKey
);
Параметры
hSLC
[вход] Описатель текущего описателя контекста SL клиента.
pAppPrdKey
[вход] Определение приведено выше в связи с функцией SLInstall.
Замечания
Приложение может иметь более чем одну лицензию. Например, когда пользователь деинсталлирует пакет Office, ассоциацию между лицензиями для Office и WinWord следует удалить, однако лицензию отдельного продукта WinWord удалять не следует.
Если функция успешно завершается, то:
Информация, связанная с данным ключом продукта, удаляется (см. описание функции SLInstall выше для соответствующей информации).
Ключ продукта, ассоциированный с GUID приложения, удаляется.
Файлы лицензий, ассоциированные с этим GUID продукта, предпочтительно сохраняются.
Возвращает
Успех или неудача.
SLConsumeRight
Функция SLConsumeRight дает возможность приложениям проверять или использовать права, хранящиеся в локальных лицензиях. При вызове этой функции происходит связывание лицензии и права, на которое указывает pszRightName. Если это право не может быть использовано вызывающим приложением, тогда приложение отказывает в соответствующем действии. Если функция завершается успехом, то могут быть выполнены действия, связанные с этим правом (как, например, уменьшение счетчика использований, уменьшение временной квоты, или никаких действий не выполняется).
HRESULT SLConsumeRight(
HSLC hSLC,
PCWSTR pszRightName,
SL_ASYNC_CONTEXT* pAsyncContext
);
Параметры
hSLC
[вход] Описатель текущего описателя контекста SL клиента.
pszRightName
[вход] Имя права, которое нужно обработать. В настоящем исполнении имя права определяется приложениями. Сервис лицензий открывает лицензию и обрабатывает условие, определяемое именем права.
pAsyncContext
[вход/выход] Если pAsyncContext равен NULL, то функция работает в синхронном режиме, в противном случае функция работает в асинхронном режиме. SL_ASYNC_CONTEXT не видна вызывающей программе и управляется сервисом лицензий.
Замечания
Все лицензии, связанные с GUID приложения (определенном в SLOpen), будут концептуально объединены в одной логической лицензии.
Если имеется несколько лицензий, предоставляющих запрошенное право, то первой будет выбрана лицензия с наивысшим приоритетом.
Возвращает
Успех или неудачу.
SLInitializeAsyncContext
Функция SLInitializeAsyncContext инициализирует асинхронный контекст, чтобы функции сервиса лицензий могли делать асинхронные вызовы.
HRESULT SLInitializeAsyncContext(
SL_ASYNC_CONTEXT* pAsyncContext, // асинхронный контекст
HANDLE hEvent, // описатель события
PVOID pvReserved // резервный, NULL
);
Параметры
pAsyncContext
[вход/выход] указатель на асинхронный контекст, который содержит информацию для асинхронных вызовов.
hEvent
Объект события, используемый для синхронизации.
pvReserved
[вход] зарезервирован для расширения.
Возвращает
Успех или неудачу.
SLCancelAsyncCall
Функция SLCancelAsyncCall используется, чтобы отменить асинхронный вызов.
HRESULT SLCancelAsyncCall(
SL_ASYNC_CONTEXT* pAsyncContext, // асинхронный контекст
BOOL fAbortCall // немедленная отмена
);
pAsyncContext
[вход] асинхронный контекст для SL асинхронного вызова.
fAbortCall
[вход] Если TRUE, то вызов отменяется немедленно. Если FALSE, то ждет пока SL закончит вызов.
Замечания
Есть два способа для вызывающей программы потребовать отменить асинхронный вызов - прерывающий и непрерывающий. В случае прерывающей отмены (fAbortCall равен TRUE) функция SLCancelAsyncCall посылает уведомление сервису лицензий об отмене и асинхронный вызов немедленно отменяется без ожидания ответа от сервиса лицензий. В случае непрерывающей отмены (fAbortCall равен FALSE) функция SLCancelAsyncCall сообщает сервису лицензий об отмене и вызывающая программа ждет когда сервис лицензий завершит вызов.
Возвращает
Успех или неудачу.
SLCompleteAsyncCall
Функция SLCompleteAsyncCall используется, чтобы завершить SL асинхронный вызов.
HRESULT SLCompleteAsyncCall(
SL_ASYNC_CONTEXT* pAsyncContext, // асинхронный контекст
HRESULT* phrAsyncCall // ошибочный код сделанного асинхронного вызова
);
Параметры
pAsyncContext
[вход] асинхронный контекст для SL асинхронного вызова.
phrAsyncCall
[выход] код ошибки сделанного асинхронного вызова.
Замечания
Если программа вызывает эту функцию перед тем как придет ответ, то вызов возвращает E_SLC_ASYNC_CALL_PENDING. Буферный регистр должен быть действующим и быть достаточно большим, чтобы принять возвращенное значение. Если вызов не возвращает E_SLC_ASYNC_CALL_PENDING, то этот запуск SLCompleteAsyncCall конечный для асинхронного вызова. После вызова этой функции, независимо успешного или неудачного, все ресурсы, предназначенные для этого асинхронного вызова, освобождаются. (Последующие вызовы функций SLCompleteAsyncCall или SLCancelAsyncCall имеют неопределенные результаты до тех пор, пока не будет инициализирован новый вызов структуры SL_ASYNC_CONTEXT).
Возвращает
Значение
Значение
S_OK
Вызов был успешно завершен
E_SLC_INVALID_ASYNC_CONTEXT
Недопустимый контекст асинхронного вызова
E_SLC_ASYNC_CALL_PENDING
Вызов еще не завершился
E_SLC_CALL_CANCELLED
Вызов был отменен
SLGetInformation
Функция SLGetInformation используется, чтобы получать разнообразную информацию.
HRESULT SLGetInformation(
HSLC hSLC, // Описатель контекста SL клиента
DWORD dwCategory, // Категория информации, которую нужно извлечь
PCWSTR pszKeyName, // Имя ключа
DWORD* pdwType, // Тип значения
SIZE_T* pcbValut, // Размер значения
PBYTE* ppbValue // Указатель на буфер значения
);
Параметры
hSLC
[вход] Описатель текущего описателя контекста SL клиента.
dwCategory
[вход] Категория информации.
Категория
Значение
SL_CAT_rightDATA
Получить информацию из привязанного права. Перед получением этих данных из права лицензия должна быть успешно применена.
SL_CAT_DYNAMICPROPERTY
Получить информацию, которая находится не в лицензии, а вычисляется в процессе работы программы. Например, RemainingGracePeriodDays. Это право должно быть получено перед вызовом. Имя ЗначенияRemainingGracePeriodDays: DWORD.Льготный период может быть определен в лицензиях на ограниченное использование. Как только приложение установлено, время льготного использования начинает уменьшаться. Приложения могут проверять оставшееся время льготного использования после того как они получили соответствующую лицензию. ActivationStatus: DWORD. После того как приложения получат лицензию, они могут получить тип лицензии. Возвращаемое значение может быть: SL_LIC_OOB. Полученная лицензия - это лицензия на ограниченное использование SL_LIC_ACQUIRED. Полученная лицензия - это добросовестно приобретенная лицензия SL_LIC_NO. NE - лицензии нет
SL_CAT_SERVICEINFO
Получить информацию, которая не зависит от лицензии. Вызывающая программа может получить информацию данной категории без обращения к лицензии. ИмяЗначениеSLVersion: DWORD. Версия сервиса лицензий. Формат 1.2.3.4 HWID: BINARY Текущий HWID.
SL_CAN_WINSOWSINFO
Получить информацию, которая является свойством права, привязанного к Windows лицензии. Это для компонентного представления. Лицензия Windows уже получена сервисом лицензий, и сервис лицензий хранит свойства связанных с нею прав.
SL_CAT_ENUMLICINFO
Когда функция SLEnumLicense вызвана и успешно завершена, вызывающая функция может запросить информацию пронумированной лицензии, используя эту категорию.
pszKeyName
[вход] Имя ключа. Например, BuildNumber
pdwType
[выход] тип данных
Значение
Значение
SL_DATATYPE_SZ
Строка в Юникоде
SL_DATATYPE_DWORD
DWORD
SL_DATATYPE_BINARY
Двоичное
pcbValue
[выход] Размер выделенного буфера (в байтах).
ppbValue
[выход] Если вызов успешный, то данные возвращаются в буфере, выделенном SLC. Вызывающее приложение должно вызвать SLFreeMemory, чтобы освободить память.
Возвращает
Успех или неудачу.
SLAcquireLicense
Функция SLAcquireLicense используется, чтобы получить лицензию для пользователя по сети. SLC перенумеровывает ключи продуктов, ассоциированные с приложением, и выбирает ключ продукта с наибольшим приоритетом продукта (см. SLInstall, информацию о регистрации). Затем SL получает из лицензии на ограниченное использование URL организации, распространяющей лицензии, и затем соединяется с этой организацией, чтобы получить лицензию.
Работа SLAcquireLicense может занять долгое время. Приложения могут вызывать эту функцию в асинхронном режиме, используя параметр pAsyncContext (NULL означает синхронный режим).
HRESULT SLAcquireLicense(
HSLC hSLC, // описатель контекста SL клиента
PCWSTR pszProdKeyHash, // хэш ключа продукта
PCWSTR pszPublishLicense, // строка издательской лицензии
SL_ASYNC_CONTEXT* pAsyncContext
);
Параметры
hSLC
[вход] Описатель текущего описателя контекста SL клиента.
pszProdKeyHash
[вход] строка хэша ключа продукта. Хэш ключа продукта создается при вызове SLInstall и поддерживается сервисом лицензий.
pszPublishingLicense
[вход] строка издательской лицензии
pAsyncContext
[вход] Асинхронный контекст для SL асинхронного вызова.
Замечания
Полученная лицензия будет храниться в хранилище лицензий, соответственно, и информация лицензии также будет зарегистрирована (см. SLInstall).
Приложениям может потребоваться добавить больше клиентской информации в лицензию. Приложение при вызове может передать эту информацию с помощью параметра pbAppData, и эти данные будут посланы организации, распространяющей лицензии.
Когда эта функция успешно завершается:
Она посылает необходимую информацию о связывании определенному серверу лицензий.
Получает лицензию от сервера лицензий.
Сохраняет лицензию в хранилище лицензий. См. описание SLInstall выше о том, как файл лицензий хранится.
Возвращает
Успех или неудачу.
SLGenerateTextChallenge
Создает текст запроса об инсталяции, который будет направлен поставщику лицензий иным способом (телефон, электронная почта, обмен файлами (file share) и т.п.).
HRESULT SLGenerateTextChallenge(
HSLC hSLC, // описатель контекста SL клиента
PCWSTR pszProdKeyHash, // строка хэша ключа продукта
BOOL fSingleSession, // для одного сеанса?
PWSTR *ppszChallenge // указатель на буфер для текста запроса
);
Параметры
hSLC
[вход] Описатель текущего описателя контекста SL клиента.
pszProdKeyHash
[вход] Строка хэша ключа продукта. Хэш ключа продукта создается при вызове SLInstall и поддерживается сервисом лицензий.
bSingleSession
[вход] Определяет, будет или нет соответствующий текстовый ответ поставщика лицензий иметь силу только в течение времени существования описателя контекста SL клиента этого сеанса.
ppszChallenge
[выход] При успешном завершении текст запроса возвращается в буфере, выделенном SLC. Вызывающая программа должна обратиться к SLFreeMemory, чтобы освободить выделенную память.
Возвращает
Успех или неудачу.
SLDepositTextResponse
Помещает отклик сервиса лицензий на текст запроса об инсталяции в систему лицензирования. Используется, чтобы активизировать лицензию с условным кодом доступа. Имеет смысл, только если имеется не получивший ответа текст запроса, который был произведен для лицензии. Если исходная лицензия указала, что этот запрос действителен только для единственного сеанса, то эта API функция должна быть вызвана с откликом до того как описатель контекста SL клиента будет закрыт, иначе вызов этой функции будет неудачным.
HRESULT LSDepositTextResponse(
HSLC hSLC, // описатель контекста SL клиента
PCWSTR pszProdKeyHash,
PWSTR pszResponse // Буфер, содержащий текст отклика
);
Параметры
hSLC
[вход] Описатель текущего описателя контекста SL клиента.
pszProdKeyHash
Строка хэша ключа продукта.
pszChallenge
[вход] Текст отклика.
Возвращает
Успех или неудачу.
SLEnumLicense
Функция SLEnumLicense используется, чтобы перенумеровать установленные лицензии и получить информацию из лицензии.
HRESULT (
HSLC hSLC, // описатель контекста SL клиента
CONST GUID* pguidApp, // GUID приложения
DWORD dwIndex // номер индекса
);
Параметры
hSLC
[вход] Описатель текущего описателя контекста SL клиента.
pguidApp
[вход] См. SLInstall. Если pguidApp не равен NULL, то нумеруются лицензии, ассоциированные с этим GUID. Если GUID равен NULL, то нумеруются все лицензии.
dwIndex
[вход] индекс лицензии, которую нужно извлечь. Эта величина должна быть ноль для первого вызова функции SLEnumLicense и затем увеличиваться для последующих вызовов.
Функция может возвращать лицензии в любом порядке.
Возвращает
E_SL_NO_MORE_DATA - нет лицензий с указанным индексом.
Замечания
Если функция SLEnumLicense успешно завершается, то информация выбранной лицензии может быть получена с помощью вызова SLGetInformation с категорией SL_CAT_ENUMLICINFO
Пример:
DWORD i=0;
PBYTE pbProductPriority=NULL;
PBYTE pbRemainingGracePeriodDays=NULL;
for (i=0;; i++)
{
EXIT_ON_ERROR(SLEnumLicense(hSLC, NULL, dwIndex));
if (E_SL_NO_MORE_DATA=SCODE(hr))
{
hr=S_OK
break;
}
EXIT_ON_ERROR(SLGetInformation (hSLC, SL_CAT_ENUMLIC, ``ProductPriority'', &dwType, &cbProductPriority, &pbProductPriority));
EXIT_ON_ERROR(SLGetInformation(hSLC, SL_CAT_ENUMLIC, ``RemainingGracePeriodDays'', &dwType, &cbRemainingGracePeriodDays, &pbRemainingGracePeriodDays));
Exit:
SLFreeMemory(pbProductPriority);
SLFreeMemory(pbRemainingGracePeriodDays);
}
SLFreeMemory
Функция SLFreeMemory используется, чтобы освободить память, выделенную SLC.
VOID SLFreeMemory(
PVOID pvMemblock, // указатель на память
);
Параметры
pvMemBlock
[вход] Ранее выделенный блок памяти, который нужно освободить.
Возвращает
Ничего.
Использование API сервиса лицензирования программного обеспечения для управления использованием программных продуктов
Программный продукт использует API, предложенный в данном изобретении, для различных целей, связанных с лицензированием, в том числе использования прав из лицензий, и извлечения данных из лицензий. Как отмечено выше, этот API позволяет программному продукту определять какие права представлены в лицензии, но предпочтительно, только сам программный продукт определяет, что делать с этой информацией - например разрешить или отказать в доступе к какой-либо функции либо полностью отклонить операцию и т.д. Следующее описание чертежей Фиг.4 и Фиг.5 показывает как API, предложенный в данном изобретении, используется программным продуктом.
Фиг.4 показывает пример процесса, посредством которого приложение "использует" право. Приложение вызывает метод SLConsumeRingt (402). Как обсуждалось выше, аргументы функции SLConsumeRingt включают описатель клиента, присвоенный сервисом лицензий, и имя права (которое присвоено производителем программного продукта, к которому относится это право). Сервис лицензий (сервис 202, показанный на Фиг.2) принимает вызов (404). Затем сервис находит лицензии, которые содержат указанное право, и проверяет корректность привязки и действительность лицензий. Как замечено выше, лицензии находятся в хранилище лицензий; если имеется более чем одна лицензия, относящаяся к программному продукту, который сделал вызов SLConsumeRingt, то может быть использовано правило приоритета, чтобы выбрать одну из подходящих лицензий. Проверка привязки означает определение того, что: (1) лицензия привязана к ключу программного продукта, определенного описателем клиента; и (2) лицензия привязана к машине, на которой этот программный продукт используется (или группе машин, членом которой является данная машина). Проверка действительности лицензии может включать определение того, что для данного права не истек срок действия (для лицензий, которые определяют сроки конца действия), и что не превышено максимальное число использований данного права (в случае, когда лицензия определяет максимальное число использований данного права (то есть "использований")).
Если определено, что лицензия и/или право корректно привязаны и действительны (408), то лицензия связывается с правом, запрошенным в API вызове (412) (Следует заметить, что "привязывание" лицензии к машине, среде, и ключу продукта означает, что лицензия определяет на какой машине/машинах и с каким ключом продукта она может использоваться; "привязывание" лицензии к праву означает, что функция "использовать право" завершилась успешно и соответствующее право найдено в какой-то лицензии. В настоящем описании будет ясно из контекста, какой смысл имеет слово "привязывание"). Затем API вызов возвращается вызывавшему приложению и сообщается, что вызов был успешным (414). Если было установлено, что лицензия и/или право недействительны или некорректно привязаны к машине, среде или ID продукта, то вызов SLConsumeRingt возвращается вызывающему приложению и указывает, что операция не удалась (410).
Если SLConsumeRingt возвращает неудачу, то право, определенное в вызове, не может быть получено из какой-либо лицензии и приложение не сможет получить никакой информации об этом праве. Однако если право найдено успешно, то приложение может использовать привязку этого права к лицензии, чтобы получить информацию из лицензии об этом праве. Например, лицензия может содержать общее право, называемое "запустить", которое означает, что приложение можно запускать. Однако для права "запустить" лицензия может содержать более специфичные параметры, относящиеся к использованию этого приложения, например лицензия может определить следует ли определенные возможности приложения (например, печатать, редактировать, сохранять и т.д.) включить или выключить и может указать специальные параметры, относящиеся к использованию этих возможностей (например, документ может быть сохранен только на машинах, которые работают в определенной области, или возможность печати может быть использована только в течение тридцати дней и т.д.). API сервиса лицензий не требует, чтобы информация какого-либо типа была ассоциирована с каким-либо правом, но скорее предоставляет механизм, посредством которого производитель приложения может ассоциировать любой тип информации с любым правом, которая затем может быть извлечена и использована приложением.
Предполагая, что право было успешно найдено, как описано на Фиг.4, приложение может затем получить информацию, ассоциированную с этим правом. Процесс получения этой информации описан на Фиг.5.
Сначала приложение вызывает метод SLGetInformation для привязанного права (502). Различные типы информации, которые могут быть извлечены, описаны выше в связи с описанием метода SLGetInformation. Затем сервис лицензий получает вызов (504). Сервис извлекает затребованную информацию из файла лицензии, который содержит это привязанное право (506). Затем сервис лицензий помещает эту информацию в буфер (508) и передает управление вызвавшему приложению (510). Вызывающее приложение затем читает содержимое буфера и выполняет все действия, которые, основываясь на извлеченной информации, оно считает необходимыми.
Следует заметить, что сервис лицензий не может знать смысл информации, которую он обрабатывает в процессе вызова SLGetInformation. Как обсуждалось выше, приведенная схема лицензирования дает механизм, посредством которого производители программного обеспечения могут создавать права и могут ассоциировать информацию с этими правами. Настоящее изобретение не ограничено также каким-либо особым типом информации, которая может быть ассоциирована с правом. После извлечения информации из лицензии эта информация просто передается в буфере сервисом лицензий приложению. Затем приложение интерпретирует извлеченную информацию, решает какие действия предпринять, основываясь на этой информации, и использует свои собственные средства защиты, чтобы привести в исполнение свои решения (Например, если, основываясь на полученной информации, приложение решит заблокировать возможность печати, то приложение содержит код, который действительно заблокирует эту функцию, и возможно код, который предотвратит взлом этой блокировки хакерами).
Следует заметить, что предшествующие примеры были приведены только с целью объяснения и никаким образом не должны быть истолкованы как ограничения настоящего изобретения. В то время как изобретение было описано по отношению к различным воплощениям, следует понимать, что слова, которые были здесь использованы, - только слова описания и иллюстрации, а не слова ограничений. Далее, хотя изобретение было описано здесь по отношению к конкретным средствам, материалам и воплощениям, не предполагается, что изобретение ограничено этими частностями, здесь описанными; скорее, изобретение распространяется на все функционально эквивалентные структуры, методы и использования, такие, которые находятся в области прилагаемой формулы изобретения. Люди, квалифицированные в компьютерных технологиях и познакомившиеся с этим изложением, могут осуществить множество модификаций изложенного, и изменения могут быть сделаны без отхода от области и сущности изобретения в его различных аспектах.