SQL Server 2014到2016链接服务器匿名登录失败问题求助
嘿,这个问题我之前碰过好多次,几乎可以肯定是Kerberos身份验证的配置缺失搞的鬼。你的Windows账户虽然在两台服务器都有sysadmin权限,但跨服务器传递凭据的时候,SQL Server需要正确的SPN(服务主体名称)来支持Kerberos身份验证,不然就会出现身份验证降级,最后直接变成匿名登录失败。
下面给你一步步的排查和解决方法,跟着来应该能搞定:
1. 先检查SPN有没有正确注册
SPN是Kerberos用来识别SQL Server服务的标识,没有它的话,跨服务器的身份凭据根本传不过去。
找域管理员要权限,打开命令提示符(必须用域管理员权限运行),执行这条命令查看Server B上SQL Server服务账户的SPN:
setspn -L <SQLServerServiceAccount>把
<SQLServerServiceAccount>换成运行Server B上SQL Server服务的那个账户(比如域账户DOMAIN\SQLServiceAcct)。正常情况下,你应该能看到类似这样的条目:
MSSQLSvc/ServerB.yourdomain.com:1433 MSSQLSvc/ServerB:1433如果看不到,那就说明SPN没注册,得手动加。
2. 手动注册SPN(如果上面查出来缺失)
还是用域管理员权限打开命令提示符,执行下面两条命令:
setspn -A MSSQLSvc/ServerB.yourdomain.com:1433 <SQLServerServiceAccount> setspn -A MSSQLSvc/ServerB:1433 <SQLServerServiceAccount>
替换ServerB.yourdomain.com为Server B的完整域名,1433是SQL Server默认端口(如果你的实例用了非默认端口,记得改成对应的端口号),<SQLServerServiceAccount>还是Server B上SQL Server的服务账户。
3. 验证Kerberos是否真的生效了
在Server A上打开SSMS,执行这条查询,看看连接到Server B时是不是用了Kerberos:
SELECT auth_scheme FROM sys.dm_exec_connections WHERE session_id = @@SPID;
如果返回KERBEROS,那身份验证就正常了;要是返回NTLM,说明还有问题,得接着查。
4. 检查本地安全策略(SPN配置好还不行的话)
有时候SPN对了,但本地安全策略不让传递凭据:
- 在Server A上,打开本地安全策略(输入
secpol.msc就行),找到本地策略 -> 用户权限分配 -> 允许计算机和用户账户被信任以便进行委派,确保你的Windows账户和SQL Server服务账户都在这个列表里。 - 同样,Server B上也要做一样的检查。
5. 确认链接服务器的安全配置没搞错
你创建链接服务器的时候,安全选项一定要设对:
- 打开链接服务器的属性,切到安全性选项卡,选使用登录用户的安全上下文(英文是"Be made using the login's current security context"),这个选项才会把你的Windows凭据传递给Server B。
额外提醒
- 如果是命名实例,SPN要改成
MSSQLSvc/ServerB.yourdomain.com:INSTANCENAME或者对应端口的格式,别搞错了。 - 因为你没有操作系统权限,上面的SPN注册和安全策略修改得找服务器管理员或者域管理员帮忙,这些操作都需要管理员权限才行。
内容的提问来源于stack exchange,提问作者Conrad S.

