ABBYY FineReader 9.0 — Решаем проблему высвобождения конкурентных лицензий

Есть у нас в обороте старенькая версия ABBYY FineReader 9.0 с небольшим количеством конкурентных лицензий и сервером лицензирования. Сервер лицензирования выдаёт клиентским компьютерам лицензии при запуске ПО на этих компьютерах, а при исчерпании пула лицензий клиент получает сообщение о невозможности запуска приложения. Распределение лицензий происходит по простому принципу «кто первый встал, того и тапки», и как-то всегда хватало приобретённого количества лицензий на всех. Однако в последнее время специалисты тех.поддержки стали фиксировать жалобы пользователей на участившиеся ситуации с нехваткой лицензий.

На сервере лицензирования картина действительно выглядела так, как будь-то нам не хватает лицензий.

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

Стоит отметить то, что суть этой проблемы заключается не в хитрых пользователях, а в том, что ABBYY FineReader 9.0 использует конкурентное распределение лицензий и при этом не имеет встроенных механизмов высвобождения лицензий для простаивающих экземпляров ПО. Не исключено, что в новых более современных версиях ABBYY FineReader эта проблема решена, однако мы имеем то, что имеем, и с этим как-то нужно жить.

Итак, мы имеем хитрых пользователей и, как следствие, нехватку конкурентных лицензий. Возникла идея о том, что если мы сможем забороть хитрецов, то вопрос нехватки лицензий самоликвидируется. После некоторых изысканий был выбран простой, но действенный вариант – автоматизация закрытия процессов FineReader на простаивающих компьютерах с помощью PowerShell. Ведь здесь всё логично и по честному – не работаешь за компьютером, значит не используешь ПО, а не используешь ПО, значит верни конкурентную лицензию в пул.  

Создаём нехитрый скрипт на PowerShell — CloseFineReader.ps1:

$procobj = Get-Process "FineReader" -ErrorAction SilentlyContinue
if ($procobj) {
  $procobj.CloseMainWindow()
  Sleep 5
  if (!$procobj.HasExited) {
    $procobj | Stop-Process -Force
  }
}
Remove-Variable procobj

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

Этот скрипт мы будем выполнять в контексте текущего пользователя, вызывая его по триггеру «При бездействии компьютера» из Планировщика заданий Windows. Учитывая то, что скрипт будет вызываться в качестве параметра powershell.exe, при его выполнении может возникнуть побочный эффект в виде мелькающего окна оболочки PowerShell. Чтобы избежать этого эффекта, вызов скрипта можно обернуть в VBS-скрипт — StartHideScript.vbs:

command = "Powershell.exe -NoProfile -File \\Path\to\Scripts\FR\CloseFineReader.ps1 -WindowStyle Hidden"
set shell = CreateObject("WScript.Shell")
shell.Run command,0

Размещаем оба файла в надёжном общедоступном сетевом расположении. И не забываем про правильную настройку прав доступа к скрипту: доступ всем – только на чтение.

В доменной групповой политике Active Directory, применяемой в контексте пользователя в разделе управления Group Policy Preferences добавим задание в Scheduled Tasks. Включим признак выполнения задания только при наличии вошедшего в систему пользователя – «Run only when user is logged on«, а в качестве имени пользователя, от которого будет выполняться задание укажем стандартную переменную окружения Windows – %username% 

В качестве триггера (условия для выполнения задания) добавим простой компьютера – «When computer is idle» («При бездействии компьютера» в локализованном варианте)

В качестве действия (Action), выполняемого заданием укажем запуск скрипта StartHideScript.vbs и каталог из которого этот скрипт будет выполняться

На закладке Conditions зададим условия, определяющие наличие факта простоя компьютера. В нашем примере начало отсчёта времени начинается после 5 минут простоя компьютера (отсутствие пользовательской активности) и длится в течение 10 минут. То есть, в общей сложности, по истечении 15 минутного простоя наступает условие для срабатывания триггера, по которому выполняется задание.

На закладке Common включим опции применения задания в контексте пользователя и включим признак, в соответствии с которым задание будет создаваться в Планировщике на клиентских компьютерах по условиям Item-level targeting

В качестве Targeting-условия добавим наличие на компьютере исполняемых файлов FineReader:

Дождёмся применения групповой политики и появления на клиентских компьютерах созданного нами задания Планировщика.

Уже спустя пару часов стало очевидно, что проблема решена… 

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

Добавить комментарий