Одной из распространённых проблем при использовании терминального (RDS/RDP) сервера, на который пробрасываются локальные принтеры с компьютеров пользователей в режиме RD Easy Print, заключается в большом количестве неактивных TS портов печати от перенаправленных принтеров (
Inactive TS Port
), которые накапливаются со временем. Все это вызывает проблемы с производительностью RDSH хоста, пропаданию перенаправленных принтеров в сессиях пользователей и другим проблем с печатью. При этом в Event Viewer могут появляться ошибки о превышении времени ожидания ответа от службы UmRdpService (перенаправитель портов пользовательского режима служб удаленного рабочего стола).
Если вы столкнулись с проблемами печати с перенаправленными принтерами на RDS сервере, откройте консоль управления печатью (
printmanagement.msc
), и перейдите в раздел Ports. В моем случае в списке портов печати содержится несколько десятков неактивных портов с именами в формате TS001: Inactive TS Port.
При подключении перенаправленного через RDP принтера, Print Spooler создает для каждого принтера виртуальный TS порт. Когда пользователь отключается от своей RDP сессии, такой порт не удаляется автоматически. Со временем количество неактивных TS портов может достигнуть десяток и сотен, что вызывает проблемы в работе службы печати Windows.
Для предотвращения проблем с печатью на терминальных серверах можно использовать следующие подходы:
- Пробрасывать в RDP сессию с компьютера пользователю только принтер, назначенный по умолчанию. Это уменьшит количество TS000 портов, который создаются на терминальном сервере. Для этого включите на RDS сервере параметр групповых политик Redirect only the default client printer (Перенаправлять только используемый по умолчанию принтер клиента) в разделе Computer Configuration -> Administrative Templates -> Windows Components -> Remote Desktop Services -> Remote Desktop Session Host -> Printer Redirection
- Периодически перезагружать RDS хост (это очищает порты печати)
- Периодически удалять неактивные TS порты
При попытке вручную удалить Inactive TS Port из консоли управления принт-сервера, появится ошибка:
Не удаётся удалить выбранный порт. Операция не поддерживается.
Очистить TS порты можно, удалив их из ветки реестра
HKLM\SYSTEM\CurrentControlSet\Control\DeviceClasses\{28d78fad-5a12-11d1-ae5b-0000f803a8c2}\##?#ROOT#RDPBUS#0000#{28d78fad-5a12-11d1-ae5b-0000f803a8c2}
Как вы видите, для каждого порта создан отдельный раздел с именем #TS001 и т.д.
Подраздел реестра формата #TS001 можно удалять целиком, если в разделе device parameters в значении Port Description указано значение Inactive TS Port. После удаления ветки реестра, нужно перезапустить службу принт-спулера (временно нарушит печать с терминального сервера).
Restart-Service Spooler
Когда неактивных портов печати десятки и сотни, проще удалить их с помощью PowerShell скрипта:
# Delete inactive TS Ports (Local Only) $Gegevens = Get-ChildItem -Path 'HKLM:SYSTEM\CurrentControlSet\Control\DeviceClasses\{28d78fad-5a12-11d1-ae5b-0000f803a8c2}\##?#ROOT#RDPBUS#0000#{28d78fad-5a12-11d1-ae5b-0000f803a8c2}' -Recurse -ErrorAction SilentlyContinue ($Gegevens.Name) -replace "\\Device parameters" | Select-Object -Unique | ForEach-Object { $subkey = ($_ -replace "HKEY_LOCAL_MACHINE\\", "HKLM:\") + "\Device Parameters" try { $PortDescription = (Get-ItemProperty -Path $subkey -ErrorAction Stop)."Port Description" if ($PortDescription -eq "Inactive TS Port") { $subkeydelete = ($_ -replace "HKEY_LOCAL_MACHINE\\", "HKLM:\") Write-Host "Deleting subkey on $env:COMPUTERNAME => $subkeydelete" Remove-Item -Path $subkeydelete -Recurse -Force } } catch { Write-Host "Error accessing ${subkey}: $_" } } Restart-Service Spooler
Это очистит неактивные порты печати.