Архитектура печати в Windows. Печать из терминальной сессии

terminal_services_c.jpg

Печать – очень важное требование перенаправления устройств, для сессий на терминальном сервере. Windows Server 2008 поддерживает две модели печати: новую модель (Easy Print) независимую от драйверов, использующую RDP 6.1 и модель для предыдущих версий RDP клиента (также используется в Windows Server 2003).В данной статье рассматривается принцип печати для клиентов RDP верисии ниже 6.1. Текст взят из книги "Windows Server 2008 Terminal Services Resource Kit" и переведен мною. Сама книга распространяется бесплатно, что не удивительно, ведь она насквозь пропитана рекламой сервера 2k8.

Модель наследования печати для терминального сервера

Принтеры доступны для приложений запущенных на терминальном сервере, как правило, эти принтеры не подключены напрямую к терминальному серверу. Для пользователей печатающих из удаленной сессии обязательны две вещи:

  • Принтер должен быть виден из удаленной сессии
  • Задание для принтера должно дойти до принтера
Дальше разберемся как работает перенаправление принтеров для RDP клиентов версии 6.0 и более ранних.

Перечисление принтеров в удаленной сессии

Один из создающих сессию компонентов перечисляет все принтеры на компьютере клиента, затем принтеры могут быть перенаправлены на сервер. Некоторые коспоненты включенные в перенаправление:

  • Winlogon.exe, процесс входа в систему Windows, начало сеанса (logon) и завершение сеанса (logoff)
  • Winsta.dll, используется для настройки сессии
  • Termsrv.dll, диспетчер удаленных подключений
  • Rdpwsx.dll, компонент режима пользователя терминального сервера, который определяет последовательность подключения для удаленной сессии использующей RDP
  • Rdpdr.sys, ядерный драйвер перенаправления устройств RDP
  • Spoolsv.exe, диспетчер очереди печати на сервере терминалов
  • Usbmon.dll, который обрабатывает все динамические порты принтера (динамические потому что они создаются и разрушаются вместе с удаленной сессией) на сервере терминалов
  • Mstscax.dll, клиент терминального сервера, который перечисляет принтере на машине клиента, их имена, драйвера и настройки
  • System Event Notification Service (SENS), которая следит за системными событиями, такими как соединение / разъединение терминальных сессий и logon / logoff событиями, доставляет их приложениям, которым это необходимо. В предыдущих версиях Windows эту роль играла Wlnotify.dll, но в Windows Server 2008 and Windows Vista был заменен на SENS.
Для автоматического перенаправления клиентских принтеров эти компоненты взаимодействуют следующими путями:
  1. Клиент mstsc.exe присоединяется к терминальному серверу и проходит через соединение и вход в систему последовательно. Winlogon.exe постоянно остается в пользовательском сеансе, как и Winsta.dll, использующийся для настройки терминальной сессии.
  2. Через winsta.dll и диспетчер удаленных соединений, Rdpwsx.dll получает уведомление о новом подключении и уведомляет Rdpdr.sys.
  3. Rdpdr.sys посылает пакет запрос на перечисление принтеров для новой сессии.
  4. Клиент собирает следующую информацию от клиентского компьютера и передает ее в сессию, где она будет передана от Rdpwsx.dll к Rdpdr.sys:
    • Данные о конфигурации принтера, включая имя, имя драйвера, ориентация бумаги, статус по умолчанию, и так далее - все стандартные для Windows принтера;
    • Очередь печати и имена портов;
    • Очереди печати созданные во время предыдущих подключений (перечисленных в подразделах HCKU\Software\Microsoft\Terminal Server Client\Default\Add Ins\RDPDR на клиентском компьютере)
  5. Rdpdr.sys создает соответствующий порт печати для каждой очереди, клиент посылает вверх, называя их TSXXX, где ХХХ-номер, начиная от 001.
  6. Rdpdr.sys также сообщает PnP API, что новый принтер доступен. API уведомляет диспетчер очереди печати (Spoolsv.exe) о новых принтерах для этого соединения. Spooler при помощи Usbmon.dll перечисляет доступные порты, как копированные с клиента так и переименованные в терминальной сессии. Диспетчер очереди печати обновляет реестр клиента, чтобы принтеры были доступны для него.
  7. Winlogon.exe сообщает System Event Notification Service (SENS) что сессия создана. SENS ждет события разъединения или выхода из системы, чтобы сообщить Rdpdr.sys когда нужно освободить используемые порты.
  8. SENS делает следующее:
    • Гарантирует что принтер имеет подходящий доступный драйвер на сервере терминалов.
    • Устанавливает принтер клиента по умолчанию в терминальную сессию.
    • Добавляет новую очередь печати в список.
    • Устанавливает параметры безопасности по умолчанию для принтера, так вошедший пользователь имеет права чтения / записи / печати для своей очереди печати и Администратор имеет полные права над ней.
    • Принтеры должны появляться в новом сеансе как TS001 - TS00n. Если принтер не видно, проверьте следующее:
    • Клиентский принтер должен быть разрешен для перенаправления. Эта политика может быть установлена в настройках служб терминалов (Terminal Services Configuration (in the RDP settings)), в оснастке пользователи и компьютеры службы каталогов(Directory Users And Computers) и в групповой политике (Group Policy).
    • Rdpdr.sys должен функционировать правильно. Если устройства не перенаправляются и с политикой перенаправления все в порядке, откройте Диспетчер устройств(Device manager) пункт Системные устройства (System Devices), перенаправитель устройства сервера терминалов(Terminal Server Device Redirector), убедитесь что он работает правильно.
    • Служба «Перенаправитель портов пользовательского режима служб терминалов» (Terminal Services UserMode Port Redirector) должна быть запущена. Если это не сделано, запустите ее и переподключите все сессии. Потому что очередь печати строится при начале соединения, просто перезагрузка этой службы не восстановит очередь печати.
    • Диспетчер печати(print spooler) на терминальном сервере должен быть запущен.

Печать из удаленной терминальной сессии

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

  1. Приложение запускает задачу печати. Пользователь может видеть все опции Win32 печати, доступные тогда, когда mstsc.exe уведомляет Rdpwsx.dll/Rdpdr.dll о доступных принтерах.
  2. Когда приложение создает задание печати при помощи графического интерфейса устройств (GDI), он создает файл расширенного формата метафайла (EMF), который содержит все указания необходимые для отрисовки этого изображения, сохраняя при этом оригинальные размеры изображения, разрешение и разметку. EMF файлы аппаратно-независимы.
  3. Когда GDI создал EMF метафайл, он отправляет его в очередь печати. Этот файл может быть сохранен на диск, если в очереди печати соответствующего принтера много заданий.
  4. Диспетчер печати отправляет файл обратно в GDI. При помощи драйвера принтера из пользовательского режима, GDI процесс преобразует задание печати в формат понятный принтеру.
  5. Предполагая, что задание будет отправлено на перенаправленный порт(с именем TSXXX), диспетчер печати отправляет его на динамический монитор портов (Usbmon.dll).
  6. Динамический монитор портов передает файл задания печати драйверу Rdpdr.sys, который пересылает RAW-данные терминальному клиенту, который в свою очередь перешлет данные соответствующему принтеру.
В итоге, большая часть подготовки задания печати происходит на терминальном сервере, драйвера принтера обязательно должны быть на нем (только так GDI сможет преобразовать файл в формат соответствующий выбранному принтеру). Каждый раз, преобразуя данные из одного формата в другой, есть вероятность потерять их.

Комментарии

спасибо за инфу, удачи вам

Добавить комментарий

BBcode1

  • Строки и параграфы переносятся автоматически.

Plain text

  • HTML-теги не обрабатываются и показываются как обычный текст
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Строки и параграфы переносятся автоматически.
CAPTCHA
Регистр символов капчи не имеет значения.