Как решить проблемы с зависанием лицензий HASP LM на терминальном сервере 1С

Системный администратор 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

Работа с аппаратными многопользовательскими ключами защиты HASP в терминальной среде Windows Server часто сопровождается неприятными симптомами. Пользователи регулярно сталкиваются с ошибками типа «Не найден ключ защиты программы», лицензии самопроизвольно блокируются с признаком Timeout = 0 в мониторе AKS (HASP Monitor), а реальное количество доступных подключений оказывается значительно меньше номинала ключа. При этом перезапуск службы HASP Loader или всего сервера помогает лишь временно.

В этой статье мы подробно разберем, почему возникают подобные сбои в терминальном режиме, и проанализируем комплексные методы решения этой проблемы — от переноса менеджера лицензий до тонкой настройки реестра Windows и конфигурационных файлов 1С.

Выясняем причины: почему зависают лицензии с Timeout = 0

Для начала проанализируем ситуацию, описанную системными администраторами. В утилите AKS Monitor сессии отображаются в статусе активных, но имеют timeout = 0. Это так называемые «зависшие» или «фантомные» лицензии. В штатном режиме менеджер лицензий HASP LM обменивается с клиентом пакетами для проверки активности. Если клиент закрыл сессию некорректно, таймаут должен постепенно уменьшаться, после чего лицензия возвращается в пул.

Однако в терминальном режиме на одном IP-адресе (адресе терминального сервера) работают десятки пользователей. Возникает конфликт одновременной раздачи. Рассмотрим основные причины возникновения зависших лицензий:

  1. Некорректное завершение сеансов 1С: Пользователи закрывают терминал «крестиком», отваливаются по таймауту неактивности (Session Timeout) или у них аварийно завершается процесс 1cv8.exe. При этом сетевое соединение разрывается некорректно, и HASP LM считает, что клиент все еще удерживает лицензию.
  2. Конфликт двойной раздачи: Самая частая системная ошибка — когда один и тот же многопользовательский HASP-ключ раздается одновременно и менеджером лицензий HASP LM, и самим сервером «1С:Предприятия» (если в свойствах базы включена опция Разрешить выдачу лицензий сервером). В этом случае лицензии блокируются намертво с нулевым таймаутом до перезапуска служб.
  3. Зависание терминальной сессии из-за печати: Это скрытая архитектурная проблема Windows Server x64, о которой мы поговорим отдельно.

Решение 1: Перенос HASP License Manager на выделенный ПК

Официальная документация разработчиков защиты Aladdin (ныне Thales) прямо указывает на то, что стабильная работа менеджера лицензий (HASP LM) на одной машине с активной службой терминалов (Remote Desktop Services) не гарантируется. Терминальный сервер создает слишком высокую нагрузку на сетевой стек и искажает логику идентификации клиентов по IP/имени компьютера.

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

  1. Выберем в локальной сети любой стабильно работающий компьютер (это может быть обычная рабочая станция, которая не выключается, или другой сервер, не являющийся терминальным).
  2. Установим на этот компьютер драйвер HASP-ключа и службу HASP HL License Manager.
  3. Вставим физический USB-ключ защиты в этот компьютер.
  4. На терминальном сервере удалим службу HASP LM, оставив только саму платформу 1С. Теперь терминальный сервер будет выступать исключительно в роли клиента, запрашивающего лицензии по сети.

Решение 2: Тонкая настройка конфигурационных файлов nethasp.ini и nhsrv.ini

По умолчанию платформа 1С пытается обнаружить ключ защиты в локальной сети с помощью широковещательных UDP-запросов (Broadcasting) по порту 475. В терминальной среде, где запущено множество сеансов, это вызывает лавинообразный рост сетевых запросов, задержки и регулярные потери ключа.

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

Выполним настройку на стороне клиента (на терминальном сервере). Для этого найдем файл nethasp.ini. Обычно он располагается в каталоге C:\Program Files\1cv8\conf\ или в папке конкретной версии платформы (например, C:\Program Files\1cv8\8.3.X.X\bin\conf\). Приведем его к следующему виду:


[NH_COMMON]
NH_TCPIP = Enabled

[NH_TCPIP]
NH_SERVER_ADDR = 192.168.1.50 ; Укажите здесь реальный IP-адрес ПК, куда перенесли ключ
NH_PORT_NUMBER = 475
NH_TCPIP_METHOD = TCP ; Переключаем с UDP на более надежный TCP
NH_USE_BROADCAST = Disabled ; Отключаем широковещательный опрос сети
NH_CLIENT_NAME = TerminalServer ; Уникальное имя клиента для монитора

Теперь настроим серверную часть менеджера лицензий на том компьютере, где физически установлен ключ. Найдем файл настроек службы nhsrv.ini (он лежит в папке с установленным HASP LM). Чтобы служба гарантированно применила параметры, скопируем этот файл также в системную папку C:\Windows\System32 (или C:\Windows\SysWOW64 для 64-битных систем) и пропишем в нем отключение неиспользуемых протоколов:


[NHS_IP]
NHS_USER_IPP_ONLY = enabled
NHS_USE_UDP = disabled ; Отключаем нестабильный UDP
NHS_USE_TCP = enabled ; Разрешаем только TCP-подключения

После внесения изменений обязательно перезапустим службу HASP Loader на сервере лицензий.

Решение 3: Устранение зависания сессий из-за процесса SplWOW64.exe

Часто системные администраторы замечают, что пользователь закрыл 1С, но его сессия в диспетчере служб терминалов RDS продолжает висеть в состоянии «Дисконнект» или «Активен», удерживая лицензию. Виновником этой проблемы является системный процесс печати SplWOW64.exe.

Когда пользователь запускает 32-битное приложение 1С на 64-битной операционной системе Windows Server и отправляет документ на печать, операционная система порождает транслятор печати — процесс SplWOW64.exe. По умолчанию этот процесс остается активным в сессии пользователя в течение 20 минут после закрытия основного приложения, чтобы ускорить последующую печать. Терминальный сервер видит активный системный процесс и не закрывает сессию до конца, из-за чего лицензия HASP остается заблокированной.

Для решения этой проблемы настроим принудительное завершение этого процесса через реестр терминального сервера:

  1. Откроем редактор реестра regedit на терминальном сервере от имени администратора.
  2. Перейдем в ветку:
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print
  3. Создадим параметр с именем SplWOW64TimeOut (тип DWORD 32 бита) и присвоим ему десятичное значение 1 (это сократит время удержания процесса в памяти до 1 секунды после закрытия печати).
  4. Перейдем в ветку, отвечающую за системные процессы терминалов:
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\SysProcs
  5. Создадим параметр с именем SPLWOW64.EXE (тип DWORD 32 бита) и присвоим ему значение 0 (это даст команду системе завершать процесс немедленно при выходе пользователя).

Для применения настроек реестра потребуется перезагрузить терминальный сервер во внерабочее время.

Решение 4: Настройка раздачи лицензий сервером 1С

Если мы используем клиент-серверный вариант работы (1С + MS SQL Server / PostgreSQL), нам необходимо четко разграничить логику подсчета лицензий. Существует два принципиально разных механизма:

Чтобы избежать хаотичного расхода и блокировок, настроим параметры информационной базы в консоли администрирования кластера 1С:

  1. Откроем консоль Администрирование серверов 1С Предприятия.
  2. Перейдем к свойствам конкретной информационной базы.
  3. Найдем параметр «Разрешить выдачу лицензий сервером».
  4. Если мы хотим, чтобы лицензии считались экономно (одна лицензия на терминальную сессию), установим значение «Нет». В этом случае раздачей будет заниматься исключительно HASP LM напрямую клиентам.
  5. Если же ключ установлен непосредственно на сервере приложений 1С и раздача через LM не планируется, установим значение «Да», но при этом полностью отключим службу HASP LM на сервере, чтобы избежать конфликтов.

Также, если используются рабочие процессы кластера, обратим внимание на частоту их перезапуска. Рекомендуется настроить интервал перезапуска рабочих процессов в свойствах кластера (параметр Интервал перезапуска процессов установить равным 86400 секунд — 24 часа), чтобы автоматически высвобождать зависшие сеансы в нерабочее время.

Решение 5: Специфика работы с программными лицензиями в терминале

Многие компании отказываются от аппаратных USB-ключей в пользу программных лицензий (пин-кодов). Однако в терминальном режиме здесь тоже есть свои нюансы. Если установить несколько однопользовательских программных лицензий на терминальный сервер, они могут начать конфликтовать или перестать видеться платформой.

Разберем по шагам правильный алгоритм перевода терминального сервера на программные лицензии:

  1. Обновим платформу 1С:Предприятие до актуального релиза. В старых версиях (8.1, ранние сборки 8.2) механизмы работы с файлами лицензий в многопользовательском режиме имели критические ошибки.
  2. Удалим остатки старых привязок. Очистим файлы с расширением .lic и файл conn8211.pfl во всех пользовательских каталогах, а также в общей папке C:\ProgramData\1C\licenses\.
  3. Произведем повторное получение лицензий. Для терминального сервера крайне важно получать лицензии по многопользовательскому пин-коду (на 5, 10, 20 и более мест) непосредственно на сам сервер, а не активировать множество однопользовательских пин-кодов на разные виртуальные машины. Файлы лицензий должны лежать строго в общей системной папке C:\ProgramData\1C\licenses, чтобы все пользователи терминала имели к ним беспрепятственный доступ на чтение.

Решение 6: Проброс USB-ключей в виртуальные машины (Hyper-V, ESXi)

При использовании виртуализации (VMware ESXi, Microsoft Hyper-V, Proxmox) часто возникает проблема физического отсутствия USB-портов в гостевой операционной системе. Использование программных эмуляторов (дампов ключей) незаконно и приводит к нестабильности платформы.

Рассмотрим цивилизованные и стабильные методы решения этой задачи:

  1. Использование аппаратных USB-over-IP концентраторов: Отличным примером является линейка устройств AnywhereUSB. Концентратор устанавливается в серверную стойку и подключается к локальной сети. На виртуальную машину устанавливается специальный драйвер-клиент, который монтирует удаленные USB-порты по IP-адресу так, будто они подключены физически к материнской плате. Это полностью решает проблему «отваливания» ключей при миграции виртуальных машин между хостами виртуализации (vMotion).
  2. Проброс USB-контроллера средствами гипервизора (USB Passthrough): В ESXi или Proxmox можно пробросить конкретный USB-порт материнской платы хоста внутрь виртуальной машины с терминальным сервером. Недостатком метода является привязка виртуальной машины к конкретному физическому серверу.

Резюмируя все вышесказанное, для стабильной работы 1С на терминальном сервере необходимо отказаться от локальной установки менеджера лицензий на терминальной машине, жестко прописать параметры TCP-подключения в файле nethasp.ini, настроить реестр Windows для корректного завершения сессий печати и разграничить зоны ответственности между сервером приложений и менеджером лицензий HASP.

← На главную