環境以及故障:
最近在處理crm2011自定義報表的時候碰到一個問題.通過crm2011的report winzard 創建報表,運行時出錯.
在crm服務器端可以看到關於mscrmreporting serivce 的報錯.如下:
Report render failure. Error: An error has occurred during report processing. (rsProcessingAborted)
在數據庫服務器端的***s 日誌中發現如下內容:
Microsoft.ReportingServices.ReportProcessing.ReportProcessingException: Query execution failed for dataset 'DSMain'. ---> System.Runtime.InteropServices.COMException (0x80040216):
System.ServiceModel.Security.SecurityNegotiationException: A call to SSPI failed, see inner exception.
System.Security.Authentication.AuthenticationException: A call to SSPI failed, see inner exception.
System.ComponentModel.Win32Exception: The target principal name is incorrect.
System.ServiceModel.Security.SecurityNegotiationException: A call to SSPI failed, see inner exception.
System.Security.Authentication.AuthenticationException: A call to SSPI failed, see inner exception.
System.ComponentModel.Win32Exception: The target principal name is incorrect.
這套環境是建立在hyper-v的虛擬機基礎上,app 和DB各佔一臺機器.APP服務器名爲:CRMAPP.test.com DB名爲CRMDB.test.com 軟件環境爲windows server 2008R2 + crm 2011 + sql2008R2. 主要軟件安裝完畢後,在DB端安裝***s ,以及crm report extension (以前版本較報表連接器). 除了開始提到的自定義報表外,所有的功能運行都正常.
分析以及排錯:
在上面的log中提到The target principal name is incorrect. 首先想到的就是SPN問題.
這裏涉及到的服務有sql和http. crm的服務賬號是test\crmsvc ,sql的服務賬號是test\sqlsvc,這兩個賬號都是普通的域賬號.首先確認spn的註冊情況.
setspn -L test\crmsvc
setspn-L test\sqlsvc
並未發現相關的spn記錄.
於是手動註冊SPN.
CRM服務:
setspn -A http/crmapp:5555 test\crmsvc (在crm的web站點在安裝的時候定義的端 口爲5555)
setspn -A http/crmapp.test.local:5555 test\crmsvc
SQL:
setspn -A MSSQLSvc/crmdb:1433 test\sqlsvc
setspn -A MSSQLSvc/crmdb.test.local:1433 test\sqlsvc
重起相關服務後,故障依舊.
在服務器端查日誌. 在sql的啓動日誌中發現 錯誤:
The SQL Network Interface library was unable to register SPN. Error: 0x54b
但是通過spn -l 確認,的確有對應的spn.何解?
在sql service啓動的時候,會自動以服務賬號註冊spn.當服務賬號權限過低時,註冊失敗.
參照 kb http://support.microsoft.com/kb/811889 ,修改服務賬號的權限,再重啓服務器,發現sql啓動日誌中註冊spn成功.(更多關於信息http://blogs.msdn.com/b/sql_protocols/archive/2006/12/02/understanding-kerberos-and-ntlm-authentication-in-sql-server-connections.aspx)
再次測試報表,居然毫無起色.查看***s的日誌,毫無頭緒.
最後在DB服務器本機訪問自定義報表 http://crmdb/reports ,打開對應的報表,輸入登錄信息後,得到的錯誤提示和***s log中是一致的.(特別注意,這裏填入的用戶信息並不是用戶名.而是用戶的GUID 信息,http://support.microsoft.com/kb/2006869)
自定義報表的數據源是MSCRM_FETCHdatasource , 這裏難道會有一個從crm再獲取某些數據的操作?這裏我也確定不了.
在DB服務器裝一個抓包工具wireshark(其他的也行). 發現在操作的過程中有個要求查詢 crmapp.test.local 的spn的過程. 因爲crm的站點綁定在5555的端口,並且手動設置的crm相關的spn也都帶上了5555的端口號.並沒有crmapp.test.local的spn信息.
試着註冊了setspn -A http/crmapp.tset.local test\crmsvc
setspn -A http/crmapp test\crmsvc
重啓sql ,***s 以及crm端的iis後. 問題居然搞定!