文本版|topic 高级搜索
   名人堂 帮助 论坛制度 意见反馈 | 首页 博客 周新贴 专题 求职 读书
RSS 底部
 
社区导航: 专家门诊   网络技术   操作系统   数据库   程序设计   系统应用   考试认证   CIO及信息化   站长交流   综合交流   下载基地  51CTO产品服务 设为首页 | 收藏本站
51CTO技术论坛» 微软SQL Server专区 » SQL Server数据库管理 » 连接报错"Cannot generate SSPI context"       [ 打印]  [ 订阅]  [ 收藏]  [ 推荐给朋友]   [ 本帖文本页]

论坛跳转:
     
标题: 连接报错"Cannot generate SSPI context"  ( 查看:149  回复:4 )   
 
leo_zhao
新新人类  点击可查看详细



十二生肖之兔   水瓶座   行业勋章   技术勋章   诚信兄弟  
帖子 11
精华 0
无忧币 17
积分 7
阅读权限 20
注册日期 2007-8-2
最后登录 2008-9-5 离线

[查看资料]  [发短消息]  [Blog
       
发表于:2008-6-24 16:27   标题:连接报错"Cannot generate SSPI context"
上一帖 |
在域用户环境下, 用普通的域用户使用SQl  客户端连接 服务器,报"Cannot generate SSPI context"
但用具有管理员权限的用户登陆可以,我刚查了下资料,好象和什么SPN 有关.

以下是我网上查的资料:
"如果您在本地系统帐户下运行 SQL Server 服务,SPN 会自动注册,并且 Kerberos 会与运行 SQL Server 的计算机成功交互。但是,如果您在域帐户或本地帐户下运行 SQL Server 服务,则创建 SPN 的尝试大多会失败,原因是域帐户和本地帐户没有设置自己的 SPN 的权限。当创建 SPN 失败时,即意味着没有为运行 SQL Server 的计算机创建 SPN。如果使用域管理员帐户作为 SQL Server 服务帐户进行测试,SPN 就会成功创建,因为存在创建 SPN 所必需的域管理员级的凭据。由于您不可能使用域管理员帐户运行 SQL Server 服务(以规避安全风险),因此运行 SQL Server 的计算机无法创建自己的 SPN。所以,如果要在连接到运行 SQL Server 的计算机时使用 Kerberos,就必须手动为运行 SQL Server 的计算机创建一个 SPN。在域用户帐户或本地用户帐户下运行 SQL Server 时必须这样做。所创建的 SPN 必须分配给该特定计算机上的 SQL Server 服务的服务帐户。除非运行 SQL Server 的计算机使用本地系统帐户启动,否则 SPN 不能分配给该计算机容器。其中必须有且只能有一个 SPN,而且必须将它分配给相应的容器。它通常是当前的 SQL Server 服务帐户。不过,它是本地系统计算机帐户。"

不知道是不是这个问题,那位熟悉的能帮着确定一下.



网络虽虚拟,技术无边界,来看看大家“真面目”!
2008-6-24 16:271楼
[ 顶部 ]
 
leo_zhao
新新人类  点击可查看详细



十二生肖之兔   水瓶座   行业勋章   技术勋章   诚信兄弟  
帖子 11
精华 0
无忧币 17
积分 7
阅读权限 20
注册日期 2007-8-2
最后登录 2008-9-5 离线

[查看资料]  [发短消息]  [Blog
       
发表于:2008-6-24 16:49 
此回复于2008-07-10 09:35被 阿楚 评为最佳答案

问题解决了,结果不是setspna的问题,主要是域控的问题。

我把问题叙述一下,以便对有相同问题到有个借鉴!

1、装SQL SERVER 时,用的是域中的administrator用户。
2、当域administrator 用户密码改动后,AD 服务没有重启前,就出现上文报的错误。
3、AD服务重启后,问题解决,用户登录正常。

4、在域administrator 用户密码改动后,如果SQL server 服务器没有重启,登录时很正常的;如果SQL server 服务器重启,就会发现sql 服务不能启动了,报登陆用户和密码错误。
5、在“服务”----“SQLSERVER" 这个服务中,把login on 中的administrator 密码修改为改动过新的密码,重启服务,SQL SERVER 就可以正常启动了。



网络虽虚拟,技术无边界,来看看大家“真面目”!
2008-6-24 16:492楼
[ 顶部 ]
 
墨小白
副版主  点击可查看详细



帖子 73
精华 0
无忧币 141
积分 59
阅读权限 140
注册日期 2008-6-24
最后登录 2008-9-5 离线

[查看资料]  [发短消息]  [Blog
       
发表于:2008-6-24 16:49 
我想请问下,你的sql-server是在域内还是域外?还有就是 sql-server能与dc正常通信么?



网络虽虚拟,技术无边界,来看看大家“真面目”!
2008-6-24 16:493楼
[ 顶部 ]
 
墨小白
副版主  点击可查看详细



帖子 73
精华 0
无忧币 141
积分 59
阅读权限 140
注册日期 2008-6-24
最后登录 2008-9-5 离线

[查看资料]  [发短消息]  [Blog
       
发表于:2008-6-24 16:51 
SQL Server 的 SPN 由下列元素构成: • 服务类:它标识一般的服务类。SQL Server 的服务类始终为 MSSQLSvc。
• 主机:它是运行 SQL Server 的计算机的完全限定域名 DNS。
• 端口:它是服务正在侦听的端口号。  
例如,运行 SQL Server 的计算机的 SPN 通常为:
MSSQLSvc/SQLSERVER1.northamerica.corp.mycompany.com:1433
默认实例的 SPN 格式与命名实例的 SPN 格式不同。端口号用于将 SPN 与特定实例联系起来。

当 客户端上的 SQL Server 驱动程序使用集成安全性连接到 SQL Server 时,客户端上的驱动程序代码会尝试使用 WinSock 网络 API 来解析运行 SQL Server 的计算机的完全限定 DNS。为了执行这一操作,该驱动程序代码会调用 gethostbyname 和 gethostbyaddr WinSock API。如果计算机使用的是集成安全性,即使 IP 地址或主机名是作为运行 SQL Server 的计算机的名称传递的,SQL Server 驱动程序也仍然尝试解析计算机的完全限定 DNS。

当 客户端上的 SQL Server 驱动程序解析运行 SQL Server 的计算机的完全限定 DNS 时,会使用相应的 DNS 创建该计算机的 SPN。因此,凡是与通过 WinSock 将 IP 地址或主机名解析为完全限定 DNS 的过程有关的问题,都有可能导致 SQL Server 驱动程序为运行 SQL Server 的计算机创建无效的 SPN。

例如,客户端 SQL Server 驱动程序可创建为已解析完全限定的 DNS 的无效 SPN 包括:
• MSSQLSvc/SQLSERVER1:1433
• MSSQLSvc/123.123.123.123:1433
• MSSQLSvc/SQLSERVER1.antartica.corp.mycompany.com:1433  
• MSSQLSvc/SQLSERVER1.dns.northamerica.corp.mycompany.com:1433
当 SQL Server 驱动程序创建了无效 SPN 时,由于 SSPI 接口会尝试在 Active Directory 目录服务中查找该 SPN,因此身份验证仍然有效,但找不到该 SPN。如果 SSPI 接口找不到该 SPN,Kerberos 身份验证就不会执行。此时,SSPI 层就切换到 NTLM 身份验证模式,同时登录过程使用 NTLM 身份验证并且通常会成功。如果 SQL Server 驱动程序创建了有效的 SPN 但未分配相应的容器,则当它尝试使用却无法使用该 SPN 时,就会出现“Cannot generate SSPI context”错误消息。如果 SQL Server 启动帐户是一个本地系统帐户,相应的容器就是计算机名称。对于任何其他帐户,相应的容器是 SQL Server 启动帐户。由于身份验证将尝试使用它所找到的第一个 SPN,因此在为容器分配 SPN 时一定不要出差错。换句话说,一个 SPN 必须且只能分配给一个容器。

Kerberos 身份验证成功的关键因素是网络上的 DNS 功能有效。您可以使用 Ping 命令行实用工具来验证客户端和服务器上的这一功能。在客户端计算机上,运行以下命令来获取运行 SQL Server 的服务器的 IP 地址(其中,运行 SQL Server 的计算机的名称是 SQLServer1): ping sqlserver1要弄清楚 Ping 命令行实用工具是否解析了 SQLServer1 的完全限定 DNS,请运行以下命令: ping -a IPAddress例如:

C:\>ping SQLSERVER1Pinging SQLSERVER1 [123.123.123.123] with 32 bytes of data:
Reply from 123.123.123.123:bytes=32 time<10ms TTL=128
Reply from 123.123.123.123:bytes=32 time<10ms TTL=128
Reply from 123.123.123.123:bytes=32 time<10ms TTL=128
Reply from 123.123.123.123:bytes=32 time<10ms TTL=128
Ping statistics for 123.123.123.123: Packets:Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:Minimum = 0ms, Maximum =  0ms, Average =  0ms

C:\>ping -a 123.123.123.123 Pinging SQLSERVER1.northamerica.corp.mycompany.com [123.123.123.123] with 32 bytes of data:
Reply from 123.123.123.123:bytes=32 time<10ms TTL=128
Reply from 123.123.123.123:bytes=32 time<10ms TTL=128
Reply from 123.123.123.123:bytes=32 time<10ms TTL=128
Reply from 123.123.123.123:bytes=32 time<10ms TTL=128

Ping statistics for 123.123.123.123: Packets:Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:Minimum = 0ms, Maximum =  0ms, Average =  0ms

C:\>
命令 ping -a IPAddress 解析为运行 SQL Server 的计算机的正确完全限定 DNS 时,客户端解析也会成功。

[ 本帖最后由 墨小白 于 2008-6-24 16:57 编辑 ]
2008-6-24 16:514楼
[ 顶部 ]
 
墨小白
副版主  点击可查看详细



帖子 73
精华 0
无忧币 141
积分 59
阅读权限 140
注册日期 2008-6-24
最后登录 2008-9-5 离线

[查看资料]  [发短消息]  [Blog
       
发表于:2008-6-24 17:13 
首先确定该帐户是否有权限登录到sql-server。
然后你需要下载一个Windows 2000 Resource Kit 工具包。(win2003也一样)在百度上面搜索很多的。
之后 使用域管理员运行其中的SetSPN.exe 控制分配给服务和启动帐户spn。



网络虽虚拟,技术无边界,来看看大家“真面目”!
2008-6-24 17:135楼
[ 顶部 ]
     
论坛跳转:  

| | |

| | |

| | |

标记已读 · 删除论坛Cookies · 文本版 · WAP
 
| 诚征版主 | 版主堂 | 意见建议 | 大史记 | 论坛地图
Copyright©2005-2008 51CTO.COM  Powered by Discuz!
本论坛言论纯属发布者个人意见,不代表51CTO网站立场!如有疑义,请与管理员联系。
京ICP备05051492号