К написанию этой статьи меня подтолкнуло желание разобраться, что из себя представляет технология Easy Print, которая появилась в Windows Server 2008. К сожалению, информации по этому вопросу довольно мало, поэтому пришлось брать ее из разных источников и систематизировать самостоятельно. Одна из наиболее удачных книг, на мой взгляд, Windows Server 2008 Terminal Services Resource Kit (Christa Anderson and Kristin L Griffin with the Microsoft Presentation Hosted Desktop Virtualization Team, Microsoft Press © 2008).
Прежде чем говорить о технологии Easy Print, кратко рассмотрим, как работает обычная система перенаправления принтеров в терминальном сервере.
Традиционная система перенаправления принтеров
Основные компоненты, которые участвуют в перенаправлении принтеров:
- winlogon.exe – процесс, который отвечает за создание/завершение сеанса и запуск оболочки пользователя;
- winsta.dll – библиотека, которая используется для настройки терминальной сессии;
- termsrv.dll – диспетчер удаленных подключений;
- rdpwsx.dll – компонент, который работает в режиме пользователя и отвечает за подключение/отключение удаленных соединений по протоколу RDP;
- rdpdr.sys – драйвер перенаправления RDP-устройств (работает в режиме ядра);
- spoolsv.exe – диспетчер очереди печати;
- usbmon.dll – компонент управления динамическими портами принтеров на терминальном сервере;
- mstscax.dll – компонент терминального сервера, который собирает информацию о принтерах на клиентской рабочей станции (имя, драйвер, настройки и т.д.);
- System Event Notification Service (SENS) – служба терминального сервера, которая отслеживает системные события (подключение\отключение сессий, создание\завершение сеансов на терминальном сервере) и передает информацию о них в приложения.
Автоматическое перенаправление клиентских принтеров в терминальную сессию без использования Easy Print происходит следующим образом:
- Клиент удаленного рабочего стола (mstsc.exe) подключается к терминальному серверу;
- В сессии пользователя запускается процесс winlogon.exe;
- Библиотека winsta.dll настраивает терминальную сессию;
- Компонент rdpwsx.dll с помощью winsta.dll и termsrv.dll обнаруживает новое соединение и уведомляет об этом драйвер перенаправления устройств rdpdr.sys;
- Драйвер перенаправления устройств посылает запрос клиенту на составление списка принтеров для дальнейшего их подключения в сессию пользователя;
- Клиент удаленного рабочего стола (mstsc.exe) собирает информацию с рабочей станции и через rdpwsx.dll посылает ее драйверу перенаправления устройств. В результате на терминальный сервер передаются следующие данные:
— конфигурация принтера (имя принтера, имя драйвера, ориентация бумаги, статус и т.д.);
— имена очередей печати (представление физического принтера в ОС Microsoft Windows) и имена соответствующих им портов;
— очереди печати, созданные во время предыдущих подключений (перечислены в разделе реестра HKCU\Software\Microsoft\Terminal Server Client\Default\Add Ins\RDPDR на клиентском компьютере); - Для каждой очереди печати при помощи драйвера перенаправления устройств создается соответствующий порт. Порты имеют имена вида «TSXXX», где XXX – номер, начинающийся с 001. При этом учитываются настройки, которые указаны в групповой политике (например, проверяется нужно ли перенаправлять все принтеры или только принтер по умолчанию).
- Драйвер перенаправления устройств через API уведомляет службу диспетчера очереди печати о появлении новых принтеров. Spoolsv.exe с помощью usbmon.dll добавляет созданные ранее порты в список доступных, и производит соответствующие обновления в реестре клиентского компьютера.
- Процесс winlogon.exe уведомляет службу SENS о создании терминальной сессии. В дальнейшем с помощью этой же службы удаляются созданные ранее порты при отключении и завершении сеанса.
- Служба SENS выполняет следующие действия:
— убеждается, что для принтера есть соответствующий драйвер на терминальном сервере;
— устанавливает принтер по умолчанию на терминальном сервере такой же как и на клиентской рабочей станции;
— добавляет очередь печати в список устройств;
— устанавливает права безопасности по умолчанию на очередь печати для подключившегося пользователя (чтение, запись, печать) и группы администраторов (полный доступ).
Процесс печати на перенаправленный принтер выглядит так:
- Пользователь запускает печать документа из какого-либо приложения;
- При помощи интерфейса графического устройства (GDI), создается файл формата EMF (Enhanced Metafile Format). Метафайл не зависит от устройства печати и содержит в себе инструкции необходимые для вывода изображения на принтер;
- Созданный файл передается в диспетчер печати терминального сервера;
- Постановленное в очередь задание возвращается в GDI. С помощью драйвера принтера, который работает в режиме пользователя, GDI преобразовывает задание из EMF в RAW-формат. В дальнейшем этот формат может быть обработан выбранным принтером.
- Задание на печать отправляется на перенаправленный порт (определенный как TSXXX);
- Диспетчер печати посылает задание на печать на монитор динамического порта (usbmon.dll);
- Монитор динамического порта передает файл компоненту rdpdr.sys, который посылает данные в готовом для печати растровом формате на соответствующий терминальный клиент, а тот уже отправляет его на нужный принтер.
Таким образом, основная обработка файла выполнятся на терминальном сервере. Отсюда и требование о том, что на терминальном сервере должен быть установлен подходящий драйвер принтера. Еще один немаловажный факт заключается в том, что задание печати посылается на терминальный клиент уже в растровом формате, что может быть критично в случае медленных каналов между сервером и клиентом.
Новая архитектура TS Easy Print
TS Easy Print разрабатывался для того, чтобы решить 4 основные проблемы с которыми сталкиваются системные администраторы:
- Драйверы, которые работают в режиме ядра, часто вызывают критические сбои в работе терминального сервера;
- Иногда имя драйвера на клиенте не совпадает с именем драйвера на сервере, в этом случае приходится вручную настраивать сопоставление в inf-файле, чтобы работало перенаправление принтеров;
- Необходимо тщательное тестирование драйвера перед его распространением на другие терминальные серверы;
- При печати на переправленный принтер передается большой объем данных по сети.
Чтобы решить описанные выше проблемы предлагается использовать новую архитектуру печати, основанную на формате XML Paper Specification (XPS). С ее помощью при печати на перенаправленном принтере можно использовать драйверы клиентского компьютера без установки их на терминальный сервер.
Для функционирования TS Easy Print на клиентском компьютере должны быть установлены:
- Клиент удаленного рабочего стола версии 6.1 или выше;
- .NET Framework 3.0 SP1 или выше.
Этим требованиям удовлетворяют наиболее распространенные на сегодняшний день версии клиентских операционных систем: Windows XP SP3, Windows Vista, Windows 7.
Процесс печати на перенаправленный принтер с использованием Easy Print происходит следующим образом:
- Пользователь запускает задание на печать из какого-либо приложения;
- В зависимости от типа приложения, задание на печать либо сразу же преобразуется в формат XPS (для приложений класса Windows Presentation Foundation), либо предварительно преобразуется в формат GDI (для Win32-приложений). ;
- Файл XPS отправляется в надстройку клиента удаленного рабочего стола, отвечающую за технологию TS Easy Print;
- Файл XPS без изменений передается напрямую драйверу печати на клиентском компьютере как XPS-обработанный файл;
- Файл XPS, предназначенный для GDI принтера, превращается в формат EMF;
- Задание на печать отправляется на принтер.
Как мы видим, использование универсального драйвера печати избавляет от необходимости установки на терминальный сервер дополнительных драйверов принтеров. Подготовленный XPS файл в отличии от EMF не требует дальнейшего преобразования в RAW. В связи с этим большую часть времени файл XPS, который содержит задание печати, гораздо меньше аналогичного EMF файла, а это в свою очередь требует меньшее количество ресурсов на его обработку. Кроме того, TS Easy Print использует виртуальные каналы, предоставляя возможность настройки свойств печати непосредственно на клиенте. Когда пользователь входит в настройки свойств принтера в терминальной сессии, драйвер TS Easy Print на терминальном сервере перехватывает этот запрос и посылает его надстройке TS Easy Print на терминальном клиенте. Клиент опрашивает установленный локально драйвер и локальные настройки принтера, а затем передает их на сервер. Таким образом, настройки полностью идентичны как на клиенте, так и на сервере.
В целом TS Easy Print превосходит традиционную систему печати по таким параметрам как:
- стабильность службы диспетчера очереди печати;
- объем передаваемых при печати данных;
- необходимость установки драйверов для принтеров на терминальные сервера;
- скорость печати.
Хотя со скоростью печати тут не так все однозначно. Если драйвер принтера изначально не поддерживает печать в формате XPS, то будет выполнено преобразование с использованием .Net Farmework. На старых медленных компьютерах этот процесс может вызвать существенную загрузку процессора и занять ощутимое время.