Привет, Хабр!
Меня зовут Артём, я системный администратор в корпоративном холдинге. В мои задачи входит поддержка серверной инфраструктуры, автоматизация процессов и сопровождение 1С — включая работу с электронной подписью через NCALayer.
На обычной рабочей станции с NCALayer проблем почти не бывает. Но стоит запустить его в терминальной среде — RDS, Citrix или Windows Server с WSP (Windows Server with Desktop Experience) — и он тут же превращается в источник постоянных сбоев.
Почему NCALayer ломается в мультисессионной среде?
По умолчанию NCALayer:
Слушает фиксированный порт (13579);
Сохраняет своё состояние в профиле пользователя;
Не умеет корректно работать в условиях одновременного запуска от нескольких пользователей.
В результате на одном сервере быстро возникают следующие проблемы:
Конфликт портов — два и более пользователя пытаются занять один и тот же порт.
Зависания процесса или аварийные завершения.
Невозможность подписывать документы в 1С, ЭСФ или через ЭДО-операторов.
Ошибка «Another instance is already running» — второй запуск блокируется.
Нестабильность токенов — у одного пользователя ЭЦП работает, у другого в той же сессии — нет.
Когда на сервере одновременно работают десятки пользователей, NCALayer внезапно становится критически важным компонентом, и его отказ может остановить ключевые бизнес-процессы.
Что нужно для стабильной работы?
Чтобы NCALayer работал надёжно в RDS/Citrix/WSP, необходимо:
Назначить уникальный порт каждому пользователю.
Передать этот порт через переменную окружения NCALAYERPORT.
Обеспечить автозапуск в контексте пользователя, а не системы.
Сделать всё автоматически, без участия конечных пользователей.
Практическое решение: два PowerShell-скрипта
Я разработал простое, но эффективное решение — два скрипта, которые можно развернуть через GPO (User Logon Scripts) или локальные политики.
Скрипт №1: назначение уникального порта
Диапазон портов: 13580–13679 (всего 100 портов — достаточно даже для крупной фермы).
$MinPort = 13580
$MaxPort = 13679
$PortRange = $MinPort..$MaxPort
function Test-PortInUse {
param([int]$Port)
$netstat = netstat -an | Select-String "LISTENING"
return ($netstat -match ":\s*$Port\s+")
}
$shuffledPorts = Get-Random -InputObject $PortRange -Count $PortRange.Count
$foundPort = $null
foreach ($port in $shuffledPorts) {
if (-not (Test-PortInUse -Port $port)) {
$foundPort = $port
break
}
}
if ($null -eq $foundPort) {
Write-Error "Все порты заняты. Не удалось назначить NCALAYERPORT."
exit 1
}
[Environment]::SetEnvironmentVariable("NCALAYERPORT", $foundPort, "User")
$env:NCALAYERPORT = $foundPort
Write-Host "NCALAYERPORT установлен: $foundPort"
Что делает:
Выбирает случайный свободный порт из заданного диапазона.
Проверяет его занятость через netstat.
Записывает порт в переменную окружения уровня User.
Гарантирует изоляцию пользовательских сессий.
Скрипт №2: добавление NCALayer в автозагрузку
$NcaLayerPath = "C:\Program Files\NCALayer\ncalayer.exe"
if (!(Test-Path $NcaLayerPath)) {
Write-Host "NCALayer не найден по пути $NcaLayerPath"
exit 1
}
$RegKey = "HKCU:\Software\Microsoft\Windows\CurrentVersion\Run"
if (!(Test-Path $RegKey)) {
New-Item -Path $RegKey -Force | Out-Null
}
$Value = "`"$NcaLayerPath`""
Set-ItemProperty -Path $RegKey -Name "NCALayer" -Value $Value -Type String
Write-Host "NCALayer добавлен в автозагрузку пользователя."
Что делает:
Добавляет NCALayer в автозагрузку только для текущего пользователя (через HKCU).
Не использует ярлыки в папке Startup — работает напрямую через реестр.
Корректно функционирует в RDS, Citrix и WSP, где профили изолированы.
Как внедрить?
Разместите оба скрипта на сетевом ресурсе или локально на серверах.
Назначьте их через GPO → User Configuration → Policies → Windows Settings → Scripts (Logon).
Убедитесь, что скрипты выполняются в контексте пользователя (это важно!).
Порядок выполнения: сначала назначение порта, затем — регистрация автозапуска.
Результаты внедрения
После развёртывания на терминальных серверах (Windows Server 2008 R2, 2012 R2, 2019 и 2022):
Исчезли конфликты портов.
Перестала появляться ошибка «Another instance is already running».
Токены перестали «отваливаться» у случайных пользователей.
Жалобы от пользователей прекратились полностью.
NCALayer стабильно работает в каждой сессии, независимо от других.
Решение универсально: подходит для любых терминальных сред, где используется 1С с ЭЦП — будь то RDS, Citrix, WSP или виртуальные рабочие столы.
Заключение
Если вы используете NCALayer в многопользовательской инфраструктуре — не полагайтесь на его поведение по умолчанию. Без правильной настройки он станет источником сбоев в критически важных системах:
Электронный документооборот (ЭДО)
Электронные счёт-фактуры (ЭСФ)
Внутренние корпоративные сервисы с ЭЦП
Предложенное решение устраняет проблему на корню, требует минимальных ресурсов и легко масштабируется. А главное — оно полностью автоматизировано и не зависит от действий пользователя.
Если у вас есть опыт борьбы с NCALayer в терминальных средах — делитесь в комментариях! Интересно узнать, как с этим справляются другие администраторы.
Podgorbunskih
А какой смысл заниматься такими танцами когда 1С прекрасно работает без NCALayer достаточно установить крипто библиотеки на сервера RDS и настроить 1С
DaRoni
Оно не только для 1С нужно, в заключений коротко указано для каких ещё систем требуется. К сожалению сейчас даже кадровику требуется NCLAyer.