賈之寬曾經在一篇文章裡評論汪峰和許巍的差別時說,汪峰是入世的哲學,也就是儒家哲學,通俗的說就是要拯救世界。而許巍是出世哲學,是道家,講究無為而治,希望歸隐山林什麼的。汪峰,許巍,我都喜歡,我更喜歡汪峰,不是因為他更好,而是他更符合我現在的心境。也許以後我會覺得許巍更符合我的心境。但我堅信我們普通的每個人都有這樣的傾向,這不是偉人的特權。有的人知足,樂于逍遙;有的人憤青,不平于世。
--題外話
我發現寫一些WIndows列印的細節你們并不愛看,那我直接寫Citrix的列印技術吧!
君子性非異也,善假于物也!可能人們都學過這句話,但是未必人人都能了解到位。用我們今天的話來說呢,就是牛逼的人之是以與衆不同,并不是他們天生就與衆不同,而是牛逼的人,更會利用自己所有的資源,會借勢,會登高而望,會巧用他物,也就是能夠站在巨人的肩膀之上。“如果我比别人看得更遠,那是因為我站在巨人的肩上”這句話最早出現在艾薩克牛頓寫給羅伯特胡克的一封信中,很多人認為這句話展現了牛頓謙遜的品格,而事實并非如此。其實,這是牛頓在嘲笑身材矮小且駝背的胡克。不管最初的出處意圖是什麼,但是在今天,在IT界,站在巨人的肩上意味着我們不需要重複造輪子,要實作我們的功能隻需借助别人已經編輯好的代碼或者以實作功能基礎之上再行修改成符合我們自己要求的即可。而别人也在開發的時候給我們提供了一扇供我們爬到巨人肩上的×××,我們隻需要順着×××爬上去就好!
Citrix的列印技術就是站在Windows的列印技術的肩膀上的,了解Citrix列印機必須要了解Windows列印。Windows列印的一些基礎概念以及列印元件等可以參看我之前發Windows列印體系結構的文章。是以在這裡我就不必在闡述Windows列印基本的東西了。
本文為介紹Citrix列印技術的第一部分,行文的組織結構為:
1、介紹思傑列印環境的一些基本概念群組件
2、介紹微軟和思傑列印服務
在Citrix的列印環境中,存在的主要列印元件如下:
列印機
列印機驅動程式
列印程序
列印伺服器
背景列印程式Print Spooler(Spoolsv.exe)
思傑列印管理服務(CpSvc.exe)
思傑通用列印服務(UPServer.exe)和思傑XTE伺服器托管UP Web服務(XTE.exe)
列印機主要指是的列印裝置,包含很多類型的列印裝置。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 UniversalPrinter(CUP)是Citrix基于Windows的列印體系結構的基礎上開發的,使用思傑通用列印驅動程式(UPD)。其中Citrix UniversalPrinter(CUP)是在VDA桌面/伺服器上建立的一台Citrix UniversalPrinter(CUP)的列印機,使用者在列印的時候在Citrix會話中選擇Citrix Universal Printer(CUP)列印機,Citrix UniversalPrinter(CUP)列印機會将列印任務發送到客戶機上指定的預設列印機,通過客戶機上的真實的預設列印機進行列印操作。如下圖,建立的Citrix UniversalPrinter(CUP)在Windows中的圖示和名稱。針對Citrix UniversalPrinter(CUP)的詳細資訊我們在思傑通用列印解決方案(Citrix UniversalPrinting Solution)中再行讨論。
而對于Citrix PDF Printer(CPP),Citrix為其開發了專門的Citrix PDF driver,和adobe的PDF類似,這是一個虛拟機的PDF列印機,提供将Citrix會話中的Word檔案、PPT檔案以及Execl檔案列印成PDF檔案的能力。為什麼要提供這個一個PDF列印機呢?提供這個Citrix PDF虛拟列印機的主要目的是提供給HTML5 Receiver和 Chrome Receiver使用的。在使用HTML5 Receiver和 Chrome Receiver通路Citrix會話的時候,将本地列印機或網絡列印機通過TML5 Receiver或Chrome Receiver映射到Citrix會話中存在一些複雜性問題,是以為了保證這類型的會話中使用者列印需求的使用者體驗,Citrix開發了這個Citrix PDF列印機,使用者在這類型的會話中,需要列印的時候,先将其通過Citrix PDF列印機将檔案列印成PDF檔案,再通過别的伺服器端或者用戶端的列印機列印出來。
Citrix的會話如何識别這類型的特殊列印機呢?和識别網絡列印機類似,也是通過系統資料庫項識别,通過讀取HKLM\SYSTEM\CSS\Control\Print\Printers下的鍵值識别該類型的列印機。
介紹完Citrix環境下的列印機,我們來說說Citrix環境下的列印機驅動程式。同列印機類似,通路https://citrixready.citrix.com,檢視有關驗證的列印機驅動程式。
在Citrix環境下,列印機的驅動類型被分為兩類:
Universal PrinterDriver(簡稱UPD)
Native Printer Driver(簡稱NPD)
Universal PrinterDriver(UPD)中文全稱為通用列印機驅動程式,這個通用列印機驅動程式其實在Windows平台下有Windows的通用列印機驅動程式,HP平台下有HP的通用列印機驅動程式,在Citrix平台下就是Citrix的通用列印機驅動程式。Native Printer Driver指的是本地列印機驅動程式,其實就是指列印機本身的列印機驅動程式,比如HP的列印機驅動程式或者基于Windows通用列印機驅動程式的列印機等等。
Citrix通用列印驅動程式是一款獨立于裝置的列印機驅動程式。如果配置 Citrix通用列印驅動程式,則系統預設使用基于EMF的通用列印驅動程式。EMF是微軟的列印檔案格式。在之前文章Windows列印體系中已經說明該列印格式,隻是沒有細說EMF的一些細節。為了友善了解,這裡簡單介紹下,微軟支援兩個所謂的列印檔案格式:EMF和XPS。 EMF代表的是增強型圖元位圖檔案,XPS代表的是XML紙張規格。列印檔案格式基本上指的是應用程式生成的列印輸出的類型和以及列印子系統如何将檔案進行處理(路由和渲染)。雖然Windows版本不斷更疊,但是EMF今天仍有廣泛應用在使用,而且也許是最多的。這主要是因為Windows XP和Server 2003系統占據了我們的市場及桌面太久了,很多企業的核心業務系統都是基于這個架構所開發的,如果不想進行重構,更新也必須延續這樣的架構。是以你可以大概想象依賴于EMF應用程式的數量。 XPS是後來的Vista和Server 2008中推出用于替代EMF的檔案格式,但是遺憾的是,XPS到現在還沒有完成這個使命,以至于在最新的Windows 10中,EMF和XPS還在相愛相殺。一個應用程式的編寫,或編碼方式,編譯等将決定使用什麼樣的列印檔案格式。基于Win32(Windows API)開發的應用程式,依靠并充分利用EMF列印檔案格式。使用WPF(Windows示範基礎),代表圖形子系統用于基于Windows應用程式呈現的使用者界面,依靠并使用XPS列印檔案格式。
如果看過之前發的Windows列印體系結構文章的同學,可能會搞混EMF、XPS以及RAW。在這裡我說明一下,EMF和XPS是微軟自身開發的列印檔案格式,而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的最新的驅動版本。
Printer Spooler是Windows 列印子系統的核心元件, 它将列印資料緩存為檔案, 支援脫機列印, 并負責管理和排程列印作業。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中文全稱為思傑列印管理服務,當該服務啟動時,在後端程序中運作的是CpSvc.exe。Citrix 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 Channel的SPL協定驅動子產品。同時,Citrix Print ManagerService在Print Spooler之前截取列印資料,經過處理之後在傳遞給Print Spooler服務。
Citrix UniversalPrinting Services中文全稱是思傑通用列印服務,該服務為思傑的通用列印機、通用列印伺服器以及思傑PDF虛拟列印機提供列印服務。UPWeb服務主要是通過Web即HTTP或SOAP等進遠端通路的列印服務提供思傑通用列印支援,這個服務在背景主要由XTE.exe負責。特别有意思的是,XTE.exe在老版本的IMA架構中,也在XenApp中存在。後來随着FMA架構的不斷完善,XTE又添加進了FMA架構中。
通用列印和UP Web服務:
接下來我們介紹思傑通用列印解決方案,敬請關注!