首页 > 代码库 > Citrix XenApp和XenDesktop 打印系统解析①

Citrix XenApp和XenDesktop 打印系统解析①

贾之宽曾经在一篇文章里评论汪峰和许巍的区别时说,汪峰是入世的哲学,也就是儒家哲学,通俗的说就是要拯救世界。而许巍是出世哲学,是道家,讲究无为而治,希望归隐山林什么的。汪峰,许巍,我都喜欢,我更喜欢汪峰,不是因为他更好,而是他更符合我现在的心境。也许以后我会觉得许巍更符合我的心境。但我坚信我们普通的每个人都有这样的倾向,这不是伟人的特权。有的人知足,乐于逍遥;有的人愤青,不平于世。

--题外话

 

我发现写一些WIndows打印的细节你们并不爱看,那我直接写Citrix的打印技术吧!

君子性非异也,善假于物也!可能人们都学过这句话,但是未必人人都能理解到位。用我们今天的话来说呢,就是牛逼的人之所以与众不同,并不是他们天生就与众不同,而是牛逼的人,更会利用自己所有的资源,会借势,会登高而望,会巧用他物,也就是能够站在巨人的肩膀之上。“如果我比别人看得更远,那是因为我站在巨人的肩上”这句话最早出现在艾萨克牛顿写给罗伯特胡克的一封信中,很多人认为这句话体现了牛顿谦逊的品格,而事实并非如此。其实,这是牛顿在嘲笑身材矮小且驼背的胡克。不管最初的出处意图是什么,但是在今天,在IT界,站在巨人的肩上意味着我们不需要重复造轮子,要实现我们的功能只需借助别人已经编辑好的代码或者以实现功能基础之上再行修改成符合我们自己要求的即可。而别人也在开发的时候给我们提供了一扇供我们爬到巨人肩上的梯子,我们只需要顺着梯子爬上去就好!

Citrix的打印技术就是站在Windows的打印技术的肩膀上的,理解Citrix打印机必须要理解Windows打印。Windows打印的一些基础概念以及打印组件等可以参看我之前发Windows打印体系结构的文章。因此在这里我就不必在阐述Windows打印基本的东西了。

本文为介绍Citrix打印技术的第一部分,行文的组织结构为:

1、介绍思杰打印环境的一些基本概念和组件

2、介绍微软和思杰打印服务

 

 

 

 

一、Citrix环境打印组件、打印机和驱动类型

1.1、主要打印组件概述

Citrix的打印环境中,存在的主要打印组件如下:

  • 打印机

  • 打印机驱动程序

  • 打印进程

  • 打印服务器

  • 后台打印程序Print Spooler(Spoolsv.exe)

  • 思杰打印管理服务(CpSvc.exe

  • 思杰通用打印服务(UPServer.exe)和思杰XTE服务器托管UP Web服务(XTE.exe

 

 

1.2Citrix环境下打印机

打印机主要指是的打印设备,包含很多类型的打印设备。Citrix有一个Citrix Ready 验证平台,Citrix Ready 验证是一个评估流程,旨在确保第三方产品与 Citrix 产品兼容。使用 Citrix Ready 验证方法成功通过指定的 Citrix 产品验证的第三方产品和解决方案,可以授予 Citrix Ready 认定标识。在Citrix环境下使用Citrix Ready验证的打印机,可以减少项目过程中产生的与Citrix 产品集成出现的兼容问题。

大家可以访问:https://citrixready.citrix.com,查看有关验证的打印机产品。

技术分享

这是针对物理打印机上来说,在Citrix环境下的打印机以及确保第三方打印机产品与 Citrix 产品兼容的相关信息。

针对于软件层面来说,在Windows系统层能够被识别的就是本地打印机和网络打印机两种。而Citrix环境下,Windows的网络打印机会被识别为会话打印机。为什么网络打印机会单独标记为会话打印机呢?这主要是方便进行漫游以及进行策略的访问控制。比如说,用户可以按要提供邻近打印的IP地址过滤会话打印机策略。通过邻近打印,指定IP地址范围内的用户可以自动访问该范围内存在的网络打印设备。邻近打印由Citrix通用打印服务器提供。

如果我们需要配置邻近打印的话,需要一些必备的环境条件:

  • 内部公司网络有为用户提供IP 地址服务的 DHCP 服务器。

  • 公司内的所有部门均具有唯一的指定 IP 地址范围。

  • 网络打印机存在于每个部门的 IP 地址范围内。

如果配置了邻近打印,则员工从一个部门转移到另一个部门时,无需进行其他打印设备配置。只要用户设备在新部门的IP地址范围内得以识别,即对该范围内的所有网络打印机具有访问权限。

Windows的打印机类型在Citrix会话中的表现:

技术分享

Citrix通过什么途径去识别本地打印机和网络打印机呢?一般来说,Citrix是通过读取Windows的注册表键值来识别本地打印机和网络打印机的。其中,通过读取HKLM\SYSTEM\CCS\Control\Print\Printers下的键值,识别本地打印机。通过读取HKCU\Printers\Connections下的键值,识别网络打印机。

同时,在Citrix环境下,还存在着两种特殊的打印机,即思杰通用的万能打印机对象:

  • Citrix Universal Printer(简称CUP

  • Citrix PDF Printer(简称CPP

这个Citrix UniversalPrinterCUP)是Citrix基于Windows的打印体系结构的基础上开发的,使用思杰通用打印驱动程序(UPD)。其中Citrix UniversalPrinterCUP)是在VDA桌面/服务器上创建的一台Citrix UniversalPrinterCUP)的打印机,用户在打印的时候在Citrix会话中选择Citrix Universal PrinterCUP)打印机,Citrix UniversalPrinterCUP)打印机会将打印任务发送到客户机上指定的默认打印机,通过客户机上的真实的默认打印机进行打印操作。如下图,创建的Citrix UniversalPrinterCUP)在Windows中的图标和名称。针对Citrix UniversalPrinterCUP)的详细信息我们在思杰通用打印解决方案(Citrix UniversalPrinting Solution)中再行讨论。

技术分享

而对于Citrix PDF PrinterCPP),Citrix为其开发了专门的Citrix PDF driver,和adobePDF类似,这是一个虚拟机的PDF打印机,提供将Citrix会话中的Word文件、PPT文件以及Execl文件打印成PDF文件的能力。为什么要提供这个一个PDF打印机呢?提供这个Citrix PDF虚拟打印机的主要目的是提供给HTML5 Receiver Chrome Receiver使用的。在使用HTML5 Receiver Chrome Receiver访问Citrix会话的时候,将本地打印机或网络打印机通过TML5 ReceiverChrome Receiver映射到Citrix会话中存在一些复杂性问题,因此为了保证这类型的会话中用户打印需求的用户体验,Citrix开发了这个Citrix PDF打印机,用户在这类型的会话中,需要打印的时候,先将其通过Citrix PDF打印机将文件打印成PDF文件,再通过别的服务器端或者客户端的打印机打印出来。

Citrix的会话如何识别这类型的特殊打印机呢?和识别网络打印机类似,也是通过注册表项识别,通过读取HKLM\SYSTEM\CSS\Control\Print\Printers下的键值识别该类型的打印机。

 

1.3Citrix环境下打印机驱动程序

介绍完Citrix环境下的打印机,我们来说说Citrix环境下的打印机驱动程序。同打印机类似,访问https://citrixready.citrix.com,查看有关验证的打印机驱动程序。

技术分享

Citrix环境下,打印机的驱动类型被分为两类:

  • Universal PrinterDriver(简称UPD

  • Native Printer Driver(简称NPD

Universal PrinterDriverUPD)中文全称为通用打印机驱动程序,这个通用打印机驱动程序其实在Windows平台下有Windows的通用打印机驱动程序,HP平台下有HP的通用打印机驱动程序,在Citrix平台下就是Citrix的通用打印机驱动程序。Native Printer Driver指的是本地打印机驱动程序,其实就是指打印机本身的打印机驱动程序,比如HP的打印机驱动程序或者基于Windows通用打印机驱动程序的打印机等等。

Citrix通用打印驱动程序是一款独立于设备的打印机驱动程序。如果配置 Citrix通用打印驱动程序,则系统默认使用基于EMF的通用打印驱动程序。EMF是微软的打印文件格式。在之前文章Windows打印体系中已经说明该打印格式,只是没有细说EMF的一些细节。为了方便理解,这里简单介绍下,微软支持两个所谓的打印文件格式:EMFXPS EMF代表的是增强型图元位图文件,XPS代表的是XML纸张规格。打印文件格式基本上指的是应用程序生成的打印输出的类型和以及打印子系统如何将文件进行处理(路由和渲染)。虽然Windows版本不断更迭,但是EMF今天仍有广泛应用在使用,而且也许是最多的。这主要是因为Windows XPServer 2003系统占据了我们的市场及桌面太久了,很多企业的核心业务系统都是基于这个架构所开发的,如果不想进行重构,升级也必须延续这样的架构。所以你可以大概想象依赖于EMF应用程序的数量。 XPS是后来的VistaServer 2008中推出用于替代EMF的文件格式,但是遗憾的是,XPS到现在还没有完成这个使命,以至于在最新的Windows 10中,EMFXPS还在相爱相杀。一个应用程序的编写,或编码方式,编译等将决定使用什么样的打印文件格式。基于Win32Windows API)开发的应用程序,依靠并充分利用EMF打印文件格式。使用WPFWindows演示基础),代表图形子系统用于基于Windows应用程序呈现的用户界面,依靠并使用XPS打印文件格式。

如果看过之前发的Windows打印体系结构文章的同学,可能会搞混EMFXPS以及RAW。在这里我说明一下,EMFXPS是微软自身开发的打印文件格式,而RAW是通用的打印文件格式,一般的打印机都支持RAW打印文件格式,RAW是使用非Windows程序的客户端的默认打印文件格式,比如Linux。也就是说,在Windows下,利用Windows的提供的API开发的程序,要么使用EMF要么使用XPS。只有特定的情况下开发的Windows客户端程序才能够生成RAW打印文件格式的数据类型,比如一些专门开发的行业软件,如PhotoShop 软件,这些软件会在软件本身安装有一款RAW虚拟打印的模块,将文件打印成RAW打印文件格式。

因此,Citrix通用打印驱动程序默认使用EMF打印文件格式,如果是采用WPF框架开发的应用程序,则会直接采用XPS的打印机。

同查看打印机类似,查看Citrix环境下的打印机驱动程序,通过注册表项:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Environments\<Platform>\Drivers\Version-x\<PrinterDriver>

比如在我的Windows 7系统下查看的打印机驱动程序:

技术分享

而如果在Windows 2012 R2或者Windows 8以上版本的系统环境下,在驱动版本哪里我们还可以看见V4的最新的驱动版本。

 

二、微软和思杰打印服务

 

2.1Printer Spooler

Printer SpoolerWindows 打印子系统的核心组件, 它将打印数据缓存为文件, 支持脱机打印, 并负责管理和调度打印作业。Printer Spooler我们也把它称呼为打印假脱机系统。Printer Spooler打印假脱机程序由一系列的微软提供的和可选的渲染组件组成,它的作用包括:

1、检测打印任务是在本地处理还是跨网络处理。

2、接受GDI和打印驱动为特定类型的打印机所提供的数据流。

3、缓冲绘制数据到文件中。

4、从逻辑打印队列中选出第一个有效的物理打印机。

5、将缓冲的数据流(如EMF)转换成能被打印机硬件所识别的格式(如PCL)。

6、发送打印数据流到打印机硬件中。

7、为假脱机组件和打印机的相关信息维护一个基于注册表的数据库。

Spooler的组成结构以及运行处理机制可以参看之前的文章。如下图所示,在这里目录下,会有缓存的打印假脱机文件:

技术分享

对于每个打印作业有系统打印后台处理程序生成了两个假脱机文件。一个.SHD结尾的扩展作业设置文件以及一个.SPL结尾的扩展绘图命令文件。

在后台对应的Windows Services如下图:

技术分享


这个服务有如下作用:

  • 基本的Windows O/S打印服务

  • 管理各种打印进程

  • 可配置的后台打印目录位置

  • Citrix Print ManagerService

Citrix Print ManagerService中文全称为思杰打印管理服务,当该服务启动时,在后端进程中运行的是CpSvc.exeCitrix Print ManagerService出现在2005年,Citrix在那时在自家的Citrix产品中首次加入了对打印的后台管理服务,并且开发了对应的驱动程序,默认支持EMF格式直到今天。

Citrix Print ManagerService的架构如下图所示:

技术分享

根据上图,我们将Citrix Print ManagerService的组件分为:

  • Core Service

  • SPL Protocol

  • Event Management

  • Policies and PrinterManagement

 

CoreService(核心服务)组件是由服务器,打印机,流三种类型的对象为其提供的抽象的底层远程打印协议。这些对象的具体实例从核心服务里调用相对应的API完成和各个对象的对接,同时这三个对象通过调用ICA SPL虚拟通道协议驱动程序完成其上具体实例的调用。

SPL协议组件ICASPL打印虚拟通道协议)处理所有发送到协议的信息。SPL打印虚拟通道是Citrix ICA协议里面的关于打印方面专门开发的虚拟通道,其包括处理的协议以及处理的驱动模块。该虚拟通道从CTX虚拟通道的远程客户端接收打印数据。并通过ICA SPL协议驱动模块进行处理。

事件管理器组件是由几类监测会话和打印机的事件的模块组成,过滤和筛选重要事件进入最后一个组件:策略和打印机管理组件。这个组件主要管理会话逻辑,并负责所有的策略执行和打印机自动创建。

ICA SPL protocol有很多细节,比如:

  • 客户端--服务器的能力协商机制

  • 打印机枚举机制

  • 打印机的功能和属性查询命令

  • 延长打印机属性应答

  • 打印数据流传输以及打印数据流压缩等等

在这里不占用较多篇幅来进行详细说明。

如上我们简述了Citrix Print ManagerService的架构,那么这个服务在整个体系处于什么样的位置?根据之前针对 Windows 打印架构的分析和研究,可发现打印机驱动和端口监视器是可替换的模块。首先,我们可以可定的是,端口监视器已经被改为SPL协议来代替传输,端口监视器模块,它不把打印数据转发给端口驱动,而是转发给Virual ChannelSPL协议驱动模块。同时,Citrix Print ManagerServicePrint Spooler之前截取打印数据,经过处理之后在交付给Print Spooler服务。

 

 

2.3Universal Printing andUP Web Services

Citrix UniversalPrinting Services中文全称是思杰通用打印服务,该服务为思杰的通用打印机、通用打印服务器以及思杰PDF虚拟打印机提供打印服务。UPWeb服务主要是通过WebHTTPSOAP等进远程访问的打印服务提供思杰通用打印支持,这个服务在后台主要由XTE.exe负责。特别有意思的是,XTE.exe在老版本的IMA架构中,也在XenApp中存在。后来随着FMA架构的不断完善,XTE又添加进了FMA架构中。

通用打印和UP Web服务:

技术分享

接下来我们介绍思杰通用打印解决方案,敬请关注!


本文出自 “我拿流年乱了浮生” 博客,请务必保留此出处http://tasnrh.blog.51cto.com/4141731/1854020

Citrix XenApp和XenDesktop 打印系统解析①