Привет, Хабр!

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

На обычной рабочей станции с NCALayer проблем почти не бывает. Но стоит запустить его в терминальной среде — RDS, Citrix или Windows Server с WSP (Windows Server with Desktop Experience) — и он тут же превращается в источник постоянных сбоев.

Почему NCALayer ломается в мультисессионной среде?

По умолчанию NCALayer:

  1. Слушает фиксированный порт (13579);

  2. Сохраняет своё состояние в профиле пользователя;

  3. Не умеет корректно работать в условиях одновременного запуска от нескольких пользователей.

В результате на одном сервере быстро возникают следующие проблемы:

  1. Конфликт портов — два и более пользователя пытаются занять один и тот же порт.

  2. Зависания процесса или аварийные завершения.

  3. Невозможность подписывать документы в 1С, ЭСФ или через ЭДО-операторов.

  4. Ошибка «Another instance is already running» — второй запуск блокируется.

  5. Нестабильность токенов — у одного пользователя ЭЦП работает, у другого в той же сессии — нет.

Когда на сервере одновременно работают десятки пользователей, NCALayer внезапно становится критически важным компонентом, и его отказ может остановить ключевые бизнес-процессы.

Что нужно для стабильной работы?

Чтобы NCALayer работал надёжно в RDS/Citrix/WSP, необходимо:

  1. Назначить уникальный порт каждому пользователю.

  2. Передать этот порт через переменную окружения NCALAYERPORT.

  3. Обеспечить автозапуск в контексте пользователя, а не системы.

  4. Сделать всё автоматически, без участия конечных пользователей.

Практическое решение: два 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"

Что делает:

  1. Выбирает случайный свободный порт из заданного диапазона.

  2. Проверяет его занятость через netstat.

  3. Записывает порт в переменную окружения уровня User.

  4. Гарантирует изоляцию пользовательских сессий.

Скрипт №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 добавлен в автозагрузку пользователя."

Что делает:

  1. Добавляет NCALayer в автозагрузку только для текущего пользователя (через HKCU).

  2. Не использует ярлыки в папке Startup — работает напрямую через реестр.

  3. Корректно функционирует в RDS, Citrix и WSP, где профили изолированы.

Как внедрить?

Разместите оба скрипта на сетевом ресурсе или локально на серверах.
Назначьте их через GPO → User Configuration → Policies → Windows Settings → Scripts (Logon).
Убедитесь, что скрипты выполняются в контексте пользователя (это важно!).
Порядок выполнения: сначала назначение порта, затем — регистрация автозапуска.

Результаты внедрения

После развёртывания на терминальных серверах (Windows Server 2008 R2, 2012 R2, 2019 и 2022):

  1. Исчезли конфликты портов.

  2. Перестала появляться ошибка «Another instance is already running».

  3. Токены перестали «отваливаться» у случайных пользователей.

  4. Жалобы от пользователей прекратились полностью.

  5. NCALayer стабильно работает в каждой сессии, независимо от других.

Решение универсально: подходит для любых терминальных сред, где используется 1С с ЭЦП — будь то RDS, Citrix, WSP или виртуальные рабочие столы.

Заключение

Если вы используете NCALayer в многопользовательской инфраструктуре — не полагайтесь на его поведение по умолчанию. Без правильной настройки он станет источником сбоев в критически важных системах:

  1. Электронный документооборот (ЭДО)

  2. Электронные счёт-фактуры (ЭСФ)

  3. Внутренние корпоративные сервисы с ЭЦП

Предложенное решение устраняет проблему на корню, требует минимальных ресурсов и легко масштабируется. А главное — оно полностью автоматизировано и не зависит от действий пользователя.

Если у вас есть опыт борьбы с NCALayer в терминальных средах — делитесь в комментариях! Интересно узнать, как с этим справляются другие администраторы.

Комментарии (2)


  1. Podgorbunskih
    05.12.2025 15:30

    А какой смысл заниматься такими танцами когда 1С прекрасно работает без NCALayer достаточно установить крипто библиотеки на сервера RDS и настроить 1С


    1. DaRoni
      05.12.2025 15:30

      Оно не только для 1С нужно, в заключений коротко указано для каких ещё систем требуется. К сожалению сейчас даже кадровику требуется NCLAyer.