Диспетчер печати на Windows Server 2019 падает каждые пару часов с переполнением стека в wsnmp32.dll: виноват опрос принтеров по SNMP

Что было. Сервер печати на Windows Server 2019: spoolsv.exe падает каждые 2–3 часа, все очереди уходят в офлайн до перезапуска службы. Событие Application 1000: сбойный модуль wsnmp32.dll, код исключения 0xc00000fd (переполнение стека), в стеке рекурсивные вызовы освобождения списка переменных SNMP. На сервере десяток «языковых мониторов» от разных производителей принтеров, включая драйверы времён Windows Vista.

Почему. Двунаправленная поддержка порта (bidirectional) заставляет диспетчер печати опрашивать принтеры по SNMP о состоянии (тонер, бумага). Опрос идёт через языковые мониторы производителей, и один из старых мониторов уходил в бесконечную рекурсию при разборе ответа устройства. Так как мониторы работают внутри процесса диспетчера, падал весь spoolsv.exe.

Что помогло (подтверждено). Отключить двунаправленную поддержку на всех принтерах скриптом, поставляемым с Windows:

$printers = Get-Printer
foreach ($p in $printers) {
  cscript C:\Windows\System32\Printing_Admin_Scripts\en-US\prncnfg.vbs -t -p $p.Name -enablebidi
}

(каталог локали en-US заменить на свой; параметр -enablebidi в этом скрипте отключает функцию). Падения прекратились в тот же день. Вручную то же самое: свойства принтера → Порты → снять «Разрешить двусторонний обмен данными», а для TCP/IP-портов ещё «Состояние SNMP включено» в настройках порта.

Дополнительные меры для сервера печати.

  • Изоляция драйверов: в «Управлении печатью → Драйверы» перевести драйверы производителей в режим «Изолированный», тогда их падение убивает PrintIsolationHost.exe, а не диспетчер. Ограничение: языковые мониторы изоляции не поддаются, поэтому в этом случае помогло именно отключение SNMP.
  • Удалить неиспользуемые драйверы и мониторы: Get-PrinterDriver, Remove-PrinterDriver; языковые мониторы в HKLM\SYSTEM\CurrentControlSet\Control\Print\Monitors (сначала экспорт ветки).
  • По возможности переходить на драйверы v4 или универсальные драйверы производителя: они не используют устаревшие мониторы.
  • На терминальных серверах, где принтеры перенаправляются с клиентов, полагаться на Easy Print и не ставить драйверы конкретных моделей без необходимости.

Как убедиться, что случай ваш. Событие 1000 с модулем wsnmp32.dll или с DLL из Control\Print\Monitors, регулярность падений, сервер печати с разнородным парком. Если сбойный модуль другой (драйвер конкретной модели), лечить изоляцией и обновлением этого драйвера.

Диагностика сбоев диспетчера печати описана в документации Microsoft.