环境以及故障:
最近在处理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后. 问题居然搞定!