【2008-10-30更新】依本文做法仍無法更新RSClientPrint.cab的朋友,請參考我的第三帖藥方。 

自從貼出安裝KB956391後SSRS不能列印問題後,陸續又接獲同事及網友的回報,才慢慢釐清這個事件的始未...

SSRS不能網頁列印的原因源於RSClient Print這顆元件被ActiveX KillBit封殺,而封殺的理由是基於安全考量,RSClientPrint Class存在一個GDI+漏洞,讓駭客可以透過惡意的BMP發動溢位攻擊。換句話說,KB956391為了修復GDI+弱點,就透過Kill Bit判了舊版RSClientPrint元件的死刑,安裝後SSRS不能列印是By Design,而不是Bug!

了解前因後果後,下一步就是解決問題。

微軟提供的解法是裝SQL 2005 SP2 GDR(有人稱GDR2)。我安裝GDR2後,ReportServer顯示9.00.3152,但C:\Program Files\Microsoft SQL Server\MSSQL.2\Reporting Services\ReportServer\bin\RSClientPrint.cab仍是2007/02/10的舊版,想當然爾,其中是{FA91DF8D-53AB-455D-AB20-F2F023E498D3}這顆被封殺的舊元件,問題仍未解決。

不過看到不少人分享,幾乎可以確認安裝GDR2會更新RSClientPrint.cab,換版後問題就排除,我假設我的GDR2安裝並未成功,因此未成功置換RSClientPrint。於是,我決定反安裝GDR2再重新安裝,接著就看到C:\Program Files\Microsoft SQL Server\MSSQL.2\Reporting Services\ReportServer\bin\RSClientPrint.cab變成美妙的2008/8/5的版本,Browser連上時會提示安裝新版元件,很自然地,列印功能就OK了。

以下對這個問題做個總結:

  1. Client安裝KB956391後就無法用SSRS的網頁報表列印是正常現象,理由是SSRS的舊版RSClientPrint元件有安全漏洞,不建議大家繼續使用。
  2. 由於舊版元件不安全,我們便需要更新SSRS Server,使其改用新版RSClientPrint。
    最簡單的更新方法是安裝GDR2:(要先裝SQL 2005 SP2)
    SQL 2005 SP2 GDR(General Distribution Release) KB933097
    http://support.microsoft.com/kb/933097/
    有一些GDR2安裝的注意事項,也一併列出作為參考:
    (請注意版號,可由http:// yourweb /ReportServer頁面上取得)
    http://www.microsoft.com/taiwan/sql/sp2_gdr_install.mspx
    http://blogs.msdn.com/psssql/archive/2007/04/06/post-sql-server-2005-service-pack-2-sp2-fixes-explained.aspx
  3. 安裝後確定C:\Program Files\Microsoft SQL Server\MSSQL.2\Reporting Services\ReportServer\bin\RSClientPrint.cab的檔案日期是2008/8/5,表示更新完成。此時Client再連上SSRS會提示安裝元件,安裝完成應該就可以列印。
  4. 如果一時無法裝好GDR2,又急著列印怎麼辦?
    事實上,只需先將HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\ActiveX Compatibility\{FA91DF8D-53AB-455D-AB20-F2F023E498D3}\Compatibility Flags刪除即可。如果嫌用RegEdit改太麻煩,可以將以下內容存成FixRSClientPrint.reg,點兩下執行亦可解除封殺救急。待更新SSRS後,請務必將其還原回"Compatibility Flags"=dword:00000400(或重新安裝一次KB956391)。
    Windows Registry Editor Version 5.00

    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\ActiveX Compatibility\{FA91DF8D-53AB-455D-AB20-F2F023E498D3}]
    "Compatibility Flags"=-

    ** 但還是要提醒大家,這個元件已被證實有漏洞,強制開放使用可以救急,但也意味著要承擔風險,儘速更新SSRS才是上策!!
  5. SQL 2000 Reporting Service也可能有類似問題,有人回報裝了以下Hotfix即可解決。
    SQL 2000 Reporting Service SP2 Hotfix KB954609
    http://www.microsoft.com/downloads/details.aspx?displaylang=zh-tw&FamilyID=5f9e7f78-7439-414b-a9dc-a779b89427db

Comments

# by haisheng lin

服务器环境:win2k3 sp2 en+sql 2005 sp2 ch 我公司百多个客户端也被这个问题困扰了几周,找到你到帖子时很高兴,以为可以解决了,谁知道安装补丁是发现只有英文版补丁,我们的是sql 2005 中文版,不知道是否存在问题,不管了,装吧,安装完KB933097 RSCLIENTPRINT.CAB并无更新,重装也一样,再安装最新的补丁SQLServer2005-KB953752-x64-ENU.exe,RSCLIENTPRINT.CAB是更新了,但客户端连安装插件的提示都没有了,删除注册表ID的方法也无效。 非常感谢您的文章,有空的话请抽点时间回复,谢谢。

# by Tzu

謝謝大大的分享!! 今天在公司剛好遇到這問題...看到你的文暫時解決幾台有問題的電腦... 可是如大大所說的安裝GDR2,也是和上面那位一樣.. 檔案一樣是舊的...沒有更新呢... 這是什麼原因呢???

# by Jeffrey

to haisheng, 更新的重點除了RSClientPrint.cab要更新,SSRS網頁中引用的元件CLSID必須也是新的。依您的情況,我會設法用Fiddler2之類的軟體觀察一下列印網頁中的CLSID是否已更新為41861299-EAB2-4DCC-986C-802AE12AC499? CodeBase是否有正確指向RSClientPrint.cab? to Tzu, 我第一次裝完GDR2,RSClientPrint.cab也是沒更新成功,後來又移除GDR2,停止所有SQL服務再裝了第二次才成功,建議移除再重裝試試。

# by Lisa

嗯嗯...我試過2次了...還是沒更新過去...

# by Aesop

感謝Jeffrey 小弟第一次也沒更新過去Services是開啟的 將Services停掉之後才更新就OK了(更新後要重開機喔) 沒重開機好像沒用 RSClientPrint.cab就更新為2008/8/5版本

# by Aesop

小弟更新過去了感謝Jeffrey的提點 第一次也是沒將服務停掉更新失敗 第二次停了服務重開機之後,就可以使用了

# by Scott

這邊sql server 2005之前做過update,下載此套件會出現無法安裝請下載3282版本,去microsoft搜尋再次下載安裝即可, 附上微軟網址。 http://support.microsoft.com/kb/953752/zh-tw

# by Jeffrey

今天遇到一台機器使用GDR2一直無法更新,因此我找到另一條路線: http://blog.darkthread.net/blogs/darkthreadtw/archive/2008/10/30/rsclientprint-issue-again.aspx 各位朋友如果仍無法更新成功,可以參考看看。

# by Henry

我的SQL 2000 Reporting Service確實也有問題,Client端預覽報表時按印表機的icon,左下角會出現三角形的警告,安裝了Hotfix後已經解決。 SQL 2000 Reporting Service SP2 Hotfix KB954609 安裝時不可以停用SQL Server,否則會更新失敗,更新後也不用重新開機,Client端預覽報表時按印表機的icon已經會出現列印視窗並可將報表印出,更新後的RSClientPrint.cab為2008/8/4,感謝感謝^^

Post a comment