目标主体名称不正确。无法生成 SSPI 上下文。

139

我正在努力从A机器连接到运行SQL Server的B机器。

我已经进行了广泛的谷歌搜索,但找到的所有方法都没有起作用。也没有一步步地指导解决这个问题。

我们没有使用Kerberos,而是使用配置的NTLM。

输入图像描述

涉及的机器是(为安全起见,xx用于隐藏某些机器名称):

  • xxPRODSVR001 - Windows Server 2012域控制器
  • xxDEVSVR003 - Windows Server 2012(此机器生成错误)
  • xxDEVSVR002 - Windows Server 2012(此机器正在运行SQL Server 2012)

在DC(xxPRODSVR001)上注册了以下SPN。为安全起见,我隐藏了域名:

CN = xxDEVSVR002,CN =计算机,DC = yyy,DC = local的Registered ServicePrincipalNames:

            MSSQLSvc/xxDEVSVR002.yyy.local:49298

            MSSQLSvc/xxDEVSVR002.yyy.local:TFS

            RestrictedKrbHost/xxDEVSVR002

            RestrictedKrbHost/xxDEVSVR002.yyy.local

            Hyper-V Replica Service/xxDEVSVR002

            Hyper-V Replica Service/xxDEVSVR002.yyy.local

            Microsoft Virtual System Migration Service/xxDEVSVR002

            Microsoft Virtual System Migration Service/xxDEVSVR002.yyy.local

            Microsoft Virtual Console Service/xxDEVSVR002

            Microsoft Virtual Console Service/xxDEVSVR002.yyy.local

            SMTPSVC/xxDEVSVR002

            SMTPSVC/xxDEVSVR002.yyy.local

            WSMAN/xxDEVSVR002

            WSMAN/xxDEVSVR002.yyy.local

            Dfsr-12F9A27C-BF97-4787-9364-D31B6C55EB04/xxDEVSVR002.yyy.local

            TERMSRV/xxDEVSVR002

            TERMSRV/xxDEVSVR002.yyy.local

            HOST/xxDEVSVR002

            HOST/xxDEVSVR002.yyy.local

CN=xxDEVSVR003,CN=计算机,DC=yyy,DC=local的已注册ServicePrincipalNames:

            MSSQLSvc/xxDEVSVR003.yyy.local:1433

            MSSQLSvc/xxDEVSVR003.yyy.local

            Hyper-V Replica Service/xxDEVSVR003

            Hyper-V Replica Service/xxDEVSVR003.yyy.local

            Microsoft Virtual System Migration Service/xxDEVSVR003

            Microsoft Virtual System Migration Service/xxDEVSVR003.yyy.local

            Microsoft Virtual Console Service/xxDEVSVR003

            Microsoft Virtual Console Service/xxDEVSVR003.yyy.local

            WSMAN/xxDEVSVR003

            WSMAN/xxDEVSVR003.yyy.local

            TERMSRV/xxDEVSVR003

            TERMSRV/xxDEVSVR003.yyy.local

            RestrictedKrbHost/xxDEVSVR003

            HOST/xxDEVSVR003

            RestrictedKrbHost/xxDEVSVR003.yyy.local

            HOST/xxDEVSVR003.yyy.local
现在如果 SQL Server 的错误消息更具描述性并告诉我它尝试连接到哪个主体名称,我可能能够诊断出问题所在。 那么,有人可以向我介绍如何解决这个问题吗?或者你能否在我提供的内容中看到任何错误? 我很乐意生成更多的调试信息,只要告诉我您需要什么。

我们没有运行内部DNS服务器。但是为了排除这个问题,您是说我应该“ping -a x.x.x.x”还是有其他方法确定是否存在重复项? - TheEdge
我不是专家,但我认为SPN和SSPI是Kerberos的一部分吗?你确定你没有使用Kerberos吗? - Dylan Smith
@DylanSmith 我没有看到任何问题..... 当我在 SQL Server 中运行 SP(现在忘记名称了),它全部显示为 NTLM。你知道我该如何检查吗? - TheEdge
我知道这个问题很老了,所以节省时间并运行此工具:https://www.microsoft.com/en-us/download/details.aspx?id=39046&WT.mc_id=soc-n-[TR]-loc-[Services]-[farukc] - Eduardo
57个回答

91
尝试退出登录,然后重新登录。
我在一个我正在开发的ASP.NET MVC应用程序中遇到了这个问题,当我更改了Windows密码后。重新登录解决了这个问题。

当我在SSMS中遇到这个错误时,重新启动并重新登录,问题解决了。 - Orn Kristjansson

31

SSPI上下文错误明确表示尝试使用Kerberos进行身份验证。

由于Kerberos身份验证SQL Server的Windows身份验证依赖于Active Directory,它需要您的计算机和网络域控制器之间建立可信任关系,因此您应该首先验证此关系。

您可以通过以下Powershell命令Test-ComputerSecureChannel快速检查该关系。

Test-ComputerSecureChannel -Verbose

enter image description here

如果返回“False”,则必须修复计算机Active Directory安全通道,因为在计算机外没有域凭据验证是不可能的。
您可以通过以下PowerShell命令修复计算机安全通道:
Test-ComputerSecureChannel -Repair -Verbose

如果上述方法不起作用(因为您的域凭据无法使用,因为该计算机不受信任),则可以从提升的cmd.exe提示符中使用NETDOM RESET代替:
NETDOM RESET %COMPUTERNAME% /UserO:domainAdminUserName /Password0:* /SecurePasswordPrompt

(是的,命令行参数确实有一个大写字母“O”(大写字母“O”,不是数字零0)。选项/Password0:* /SecurePasswordPrompt将使用凭据弹出窗口,而不是让您直接在命令行中输入密码,这是绝不能做的)。

如果您正在使用Kerberos,则可以检查安全事件日志,您应该看到具有身份验证包:Kerberos的登录尝试。

NTLM身份验证可能会失败,因此正在进行Kerberos身份验证尝试。您还可能在安全事件日志中看到NTLM登录尝试失败?

您可以在开发中打开Kerberos事件日志记录以尝试调试Kerberos失败的原因,尽管它非常冗长。

Microsoft的SQL Server的Kerberos配置管理器可以帮助您快速诊断和解决此问题。

这是一个好故事可以阅读:http://houseofbrick.com/microsoft-made-an-easy-button-for-spn-and-double-hop-issues/

1
这对我解决了问题。在Active Directory中,SPN已在错误的用户对象上注册。SQL Server的Kerberos配置管理器只需两个点击即可解决它! - Craig - MSFT
1
我已将Active Directory(AD)的IP地址列入白名单,SQL Server连接问题已得到解决。我还通过上述命令“Test-ComputerSecureChannel -verbose”进行了验证,在白名单中列出IP后,收到了true标志。所谓白名单,是指允许VPN或防火墙上的IP。修复命令对我没有起作用。 - Abubakar Riaz
1
问题对我来说是时间偏差。域控制器和数据库服务器之间有45分钟的时间偏差。设置正确的时间解决了这个问题。 - Jelphy
3
请注意,在PowerShell Core中不存在Test-ComputerSecureChannel - Ian Kemp

25

当我尝试使用Windows身份验证时,我遇到了同样的错误。听起来很荒谬,但以防对其他人有所帮助:这是因为我的域帐户在我仍然登录(!)时被锁定了。解锁帐户即可解决问题。


24

尝试将Integrated Security=true设置为去掉连接字符串中的该参数。


重要提示:如用户@Auspex所评论的,

移除Integrated Security将防止此错误发生,因为该错误发生在尝试使用Windows凭据登录时。不幸的是,大多数情况下,您希望能够使用Windows凭据登录。


1
如果连接是通过SSMS,您如何删除它? - Geoff Dawdy
36
很明显,删除“集成安全性(Integrated Security)”将会防止这个错误的发生,因为该错误会在尝试使用您的Windows凭据登录时出现。不幸的是,大多数情况下,您希望能够使用您的Windows凭据进行登录! - Auspex
2
@GeoffDawdy,我的下面的回答可能有所帮助吗?这是由于密码过期,需要我更改密码,注销并重新登录,然后一切正常工作。 - Matt Shepherd

22

我之前使用的是PIN码登录Windows 10,现在我尝试用密码登录并成功通过管理工具进入了SQL Server。


2
哎呀,那不是很对。当我没注意时,SSMS对我进行了切换并返回到我的SQL Server帐户。但最终我尝试从使用Microsoft帐户本地登录切换到使用本地帐户本地登录。这样做就解决了问题,现在似乎即使我使用PIN登录也可以正常工作。 - mcb2k3
这个有效。为什么它有效??? - Ian Kemp
@IanKemp 这个工作是因为他使用的是本地账户,而不是Active Directory账户。这个错误是特定于AD的。 - Auspex

14

为了为这个最模糊的错误添加另一个潜在的解决方案 The target principal name is incorrect. Cannot generate SSPI context. (.Net SqlClient Data Provider) :

请验证ping SQL Server时解析出来的IP是否与配置管理器中的IP相同。要检查,请打开SQL Server Configuration Manager,然后转到SQL Server Network Configuration > Protocols for MSSQLServer > TCP/IP。

确保启用了TCP/IP,并在IP地址选项卡中,确保服务器ping时解析出的IP与此处相同。这对我解决了这个错误。


谢谢Alex,你的回答比这里高票的“不要使用集成安全性”更有用。 - Jacob H

7

这通常是由于缺失、不正确或重复的服务主体名称 (SPN) 导致的。

解决步骤:

  1. 确认 SQL Server 使用的 AD 账户
  2. 以管理员模式在 Powershell 或 CMD 中运行以下命令(服务帐户不应包含域)
setspn -L <ServiceAccountName> | Select-String <ServerName> | select line
  1. Make sure the returned output contains an SPN which is fully qualified, no fully qualified, with a port and without a port.

    Expected Output:

    Registered ServicePrincipalNames for CN=<ServiceAccountName>,OU=CSN Service Accounts,DC=<Domain>,DC=com: 
    MSSQLSvc/<ServerName>.<domain>.com:1433
    MSSQLSvc/<ServerName>:1433                                           
    MSSQLSvc/<ServerName>.<domain>.com
    MSSQLSvc/<ServerName>
    
  2. If you don't see all of the above, run the following command in PowerShell or CMD in admin mode (make sure to change the port if you don't use default 1433)

SETSPN -S  MSSQLSvc/<ServerName> <Domain>\<ServiceAccountName> 
SETSPN -S  MSSQLSvc/<ServerName>.<Domain> <Domain>\<ServiceAccountName> 
SETSPN -S  MSSQLSvc/<ServerName>:1433 <Domain>\<ServiceAccountName> 
SETSPN -S  MSSQLSvc/<ServerName>.<Domain>:1433 <Domain>\<ServiceAccountName>
  1. 完成上述步骤后,通常需要几分钟进行DNS传播。

此外,如果您收到有关发现重复SPN的消息,则可能希望将其删除并重新创建。


另一种解决SPN不匹配的方法是将SQL服务帐户更改回默认的虚拟服务帐户,如此处所述:https://learn.microsoft.com/en-us/sql/database-engine/configure-windows/configure-windows-service-accounts-and-permissions?view=sql-server-ver15 关于SPN的更多信息,请参见此处:https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2012-r2-and-2012/cc731241(v=ws.11)#:~:text=LinkId%3D102555).-,Viewing%20SPNs,that%20you%20want%20to%20query。 - Todd Wilcox
这也是我的问题。我运行了Microsoft® Kerberos Configuration Manager for SQL Server实用程序,它检测到哪些SPN已损坏,并使用该工具生成脚本来解决问题。https://www.microsoft.com/en-us/download/details.aspx?id=39046 - Alexander Higgins

7
这个问题似乎是一个Windows凭据问题。我在我的工作笔记本电脑上通过VPN也遇到了相同的错误。虽然我已经成功地以我的域/用户名登录,但是当我切换到另一个连接的VPN时,就会收到此错误。我原以为这是DNS问题,因为我可以ping通服务器,但事实证明我需要从命令提示符中显式地以我的用户身份运行SMSS。
例如: runas /netonly /user:YourDoman\YourUsername "C:\Program Files (x86)\Microsoft SQL Server Management Studio 18\Common7\IDE\Ssms.exe"

我曾经遇到过类似的问题(iMac使用Windows虚拟机时无法连接VPN)。我通过将我的工作DNS服务器添加到Mac的Wi-Fi网络设置中来解决它。我猜可能有更好的方法,但这种方法对我起作用了。 - Erik Pearson

7

我刚刚遇到了这个问题,通过以下两步处理,成功解决:

  1. Granting read/write servicePrincipalName permissions to the service account using ADSI Edit, as described in https://support.microsoft.com/en-us/kb/811889
  2. Removing the SPNs that previously existed on the SQL Server computer account (as opposed to the service account) using

    setspn -D MSSQLSvc/HOSTNAME.domain.name.com:1234 HOSTNAME
    

    where 1234 was the port number used by the instance (mine was not a default instance).


我将一个 MS SQL Server 实例从使用 NT Service\MSSQLSSERVER 切换到使用托管服务帐户运行。在这样做之后,SSMS 可以在服务器本地连接到数据库,但无法从我的笔记本电脑远程连接。修复 SPN 解决了这个问题。 - Hydrargyrum

7
在我的情况下,重新启动 SQL Server 2014 (开发服务器上的) 可以解决这个问题。

同样适用于SQL Server 2016。 - youcantryreachingme
对于我的SQL Server 2019+Windows Server 2022虚拟机,我通过重新启动Windows来解决了问题,但也许只重新启动SQL Server服务就可以解决。我尝试了"Test-ComputerSecureChannel -Verbose"的解决方案,但返回的是"True",也就是正常的,所以我最终选择了重新启动机器。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接