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


89

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

我已经在Google上进行了广泛的搜索,发现的所有内容均无效。他们也不会带领您逐步解决此问题。

我们没有使用Kerberos,而是使用了NTLM。

在此处输入图片说明

涉及的机器是(出于安全目的,xx用于掩盖某些机器名称):

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

在DC(xxPRODSVR001)上注册了以下SPN。为了安全起见,我用yyy遮盖了该域:

CN = xxDEVSVR002,CN = Computers,DC = yyy,DC = local的已注册ServicePrincipalName:

            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 = Computers,DC = yyy,DC = local的已注册ServicePrincipalName:

            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 xxxx”,还是有另一种方法来确定是否重复?
TheEdge 2015年

我不是专家,但我认为SPN和SSPI是Kerberos吗?您确定不使用Kerberos吗?
迪伦·史密斯

@DylanSmith我看不到.....当我在SQL Server中运行SP(现在忘记名称)时,所有内容都显示为NTLM。你知道我怎么检查吗?
TheEdge 2015年

我知道这个问题很旧,因此节省时间并运行此工具:microsoft.com/en-us/download/…–
Eduardo

Answers:


57

我正在使用的ASP.NET MVC应用程序存在此问题。

我意识到我最近更改了密码,并且可以通过注销并再次登录来修复它。


1
这是我的问题。密码已更改。让我的帐户运行应用程序池。
Dragos Durlut

遇到此问题时,我注销并重新登录。解决了问题。
shary.sharath

类似的问题。这有助于我回顾自己的行为。TQ
Reddy

24

使用Windows身份验证通过SQL Server Management Studio连接时收到此错误。我的密码已过期,但尚未更改。更改后,我必须注销并重新登录,以便计算机使用我的新凭据运行。


22

尝试设置Integrated Security=true以从连接字符串中删除此参数。


重要提示:正如@Auspex用户评论的那样,

删除集成安全性将防止出现此错误,因为在尝试使用Windows凭据登录时会发生该错误。不幸的是,大多数情况下,您希望能够使用Windows凭据登录


如果通过SSMS建立连接,该如何删除?
Geoff Dawdy

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

2
@GeoffDawdy我下面的回答可能有帮助?这是由于密码过期,要求我更改密码,注销并重新登录,然后一切正常。
马特·谢泼德

3
节省时间并运行此工具:microsoft.com/en-us/download/…–
Eduardo

15

通过Windows身份验证时遇到相同的错误。听起来可笑,但以防万一它对其他人有所帮助:这是因为在我仍然登录(!)时,我的域帐户已被锁定。解锁帐户即可解决问题。


12

我使用PIN码而不是密码登录Windows 10。我注销并使用密码代替登录,然后能够通过Management Studio进入SQL Server。


这是荒谬的。而且有效。我为此浪费了很多时间。谢谢!
mcb2k3

2
糟糕,事实并非如此。当我不在时,SSMS对我进行了切换,然后返回到我的SQL Server帐户。但是我最终尝试从使用Microsoft帐户本地登录切换为使用本地帐户。确实成功了,即使我使用PIN登录也可以正常工作。
mcb2k3

是的,使用密码而不是大头针也对我有用。微软+1。
BrunoMartinsPro

我的天啊!我不敢相信这确实有所作为!
arni

8

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

验证ping SQL Server时解析的IP与配置管理器中的IP相同。要进行检查,请打开SQL Server配置管理器,然后转到“ SQL Server网络配置”>“ MSSQLServer协议”>“ TCP / IP”。

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


7

SSPI上下文错误绝对表明正在尝试使用Kerberos进行身份验证。

由于Kerberos身份验证SQL Server的Windows身份验证依赖 Active Directory,这要求您的计算机和网络域控制器之间具有严格的关系,因此您应该首先验证该关系。

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

Test-ComputerSecureChannel -verbose

在此处输入图片说明

如果返回False,则必须修复计算机的Active Directory安全通道,因为如果没有该通道,则无法在计算机外部进行域凭据验证。

您可以通过以下Powershell命令修复计算机安全通道:

Test-ComputerSecureChannel -Repair

检查安全事件日志,如果您正在使用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/


这为我解决了这个问题。SPN在Active Directory中的错误用户对象上注册。用于SQL Server的Kerberos Configuration Manager只需单击两次即可将其修复!
Craig-MSFT

6

该问题似乎是Windows凭据问题。我在使用VPN的笔记本电脑上遇到相同的错误。我应该以我的域/用户名登录,这是我在直接连接时成功使用的名称,但是当我通过另一个连接转到VPN时,会收到此错误。我认为这是DNS问题,因为我可以ping服务器,但事实证明,我需要以用户身份从Command提示符下显式运行SMSS。

例如runas / netonly / user:YourDoman \ YourUsername“ C:\ Program Files(x86)\ Microsoft SQL Server Management Studio 18 \ Common7 \ IDE \ Ssms.exe”


我遇到了类似的问题(带有Windows VM的iMac vpn)。我通过将工作的DNS服务器添加到Mac的Wi-Fi网络设置中来解决此问题。我猜有更好的方法,但这对我有用。
埃里克·皮尔森

5

登录到您的SQL Box和客户端,然后键入:

ipconfig /flushdns
nbtstat -R

如果这不起作用,请在客户端计算机上更新您的DHCP。这适用于我们办公室中的2台PC。


在我的客户端计算机和SQL box plus上ipconfig/release以及ipconfig/renew您的客户端计算机上是否做了您的回答,但它对我不起作用;(
AlbatrossCafe

4

我只是碰到了这一点,并通过做两件事解决了它:

  1. 使用ADSI Edit向服务帐户授予读/写servicePrincipalName权限,如https://support.microsoft.com/en-us/kb/811889中所述
  2. 使用以下命令删除SQL Server计算机帐户(与服务帐户相对)上先前存在的SPN:

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

    其中1234是实例使用的端口号(mine不是默认实例)。


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


4

我在隔离的网络中的一台PC群集上测试了IPv6,当我还原到IPv4时遇到了这个问题。我以前在活动目录DNS和DHCP中玩过,所以不知道我有什么意图破坏Kerberos设置。

我用这个有用的技巧重新测试了软件外部的连接,以连接发现的远程连接。

https://blogs.msdn.microsoft.com/steverac/2010/12/13/test-remote-sql-connectivity-easily/

然后经过简短搜索后,即可在Microsoft网站https://support.microsoft.com/en-gb/help/811889/how-to-troubleshoot-the-cannot-generate-sspi-context-error-message中找到此内容 。

在SQL Server上运行该工具,看看状态是否为错误,然后单击出现的修复按钮,是否有任何问题。

这为我解决了问题。


3

这通常是由于缺少,不正确或重复的服务主体名称(SPN)

解决步骤:

  1. 确认SQL Server使用的AD帐户
  2. 在Powershell或CMD中以管理员模式运行以下命令(服务帐户不应包含域)
setspn -L <ServiceAccountName> | Select-String <ServerName> | select line
  1. 确保返回的输出包含具有端口和端口的完全合格,没有完全合格的SPN。

    预期产量:

    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. 如果您没有看到以上所有内容,请在admin模式下在PowerShell或CMD中运行以下命令(如果不使用默认值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的消息,则可能要删除它们并重新创建它们


2

访问Web应用程序时出现此问题。这可能是由于我最近更改了Windows密码。

当我更新了托管Web应用程序的应用程序池的密码时,此问题已得到解决。


2

检查客户端和服务器之间的时钟匹配。

当我间歇性地出现此错误时,以上答案均无效,然后我们发现某些服务器上的时间已经漂移,一旦再次同步它们,该错误就会消失。搜索w32tm或NTP以查看如何在Windows上自动同步时间。


1

由于我是在寻找自己的问题的解决方案时落在这里,因此我会在这里分享我的解决方案,以防其他人也落在这里。

我一直很好地连接到SQL Server,直到我的机器移到另一个域的另一个办公室。然后,在切换之后,我遇到了有关目标主体名称的错误。解决此问题的方法是使用完全限定的名称(例如server.domain.com)进行连接。实际上,一旦我以这种方式连接到第一台服务器,就可以仅使用服务器名称(无需完整资格)连接到其他服务器,但是您的里程可能会有所不同。


仅当我将证书添加到SQL连接时,此问题才发生在我身上。该证书已颁发给FQDN,因此当我连接到FQDN \ Instance时,它可以工作。
Slogmeister Extraordinaire

1

我今天遇到了这个问题,并希望分享我的修正,因为这个修正只是被忽略并且易于修正。

我们管理自己的rDNS,最近重新使用了服务器命名方案。作为其一部分,我们应该更新我们的rDNS并忘记这样做。

ping输入正确的主机名,但是ping -a返回错误的主机名。

轻松解决:更改rDNS,执行ipconfig / flushdns,等待30秒钟(这只是我做的事情),再次执行ping -a,看到它解析正确的主机名,然后连接...获利。


1

为此,我遇到了一个新问题:托管在Server 2012上的SQL2012。受命为SQL AlwaysOn创建群集。
群集已创建,每个人都收到了SSPI消息。

要解决此问题,请运行以下命令:

setspn -D MSSQLSvc/SERVER_FQNName:1433 DomainNamerunningSQLService

DomainNamerunningSQLService==我为SQL设置的域帐户,我需要一个域管理员来运行命令。群集中只有一台服务器出现问题。

然后重启SQL。令我惊讶的是我能够连接。


我遇到了同样的问题,但是它不在集群上。我已将SQL Engine服务的登录更改为域帐户。我必须MSSQLSvc/SERVER_FQNName:*从计算机帐户中删除SPN,然后将它们添加到运行该服务的用户帐户中。
Slogmeister Extraordinaire

1

我试图在Visual Studio 2015控制台应用程序中从笔记本电脑连接到运行SQL Server 2015的VM。我前一天晚上运行了我的应用程序,一切都很好。早上,我尝试调试该应用程序,但出现此错误。我试着ipconfig/flushrelease+renew和AA一堆其他垃圾,但最终...

重新启动VM,然后重新启动客户端。这为我解决了。我应该知道,每次都可以重新启动。


类似的经验,在VM上使用SQLServer 2016。不知道为什么连接开始失败。重新启动VM无需重新启动客户端即可解决此问题。
youcantryreachingme '18 -10-30

1

我在SQL Server上遇到此问题。我先设置pn -D mssqlsvc \ Hostname.domainname主机名,然后停止并启动我的SQL Server服务。

我认为仅停止和启动我的sql服务就可以完成。


这是我setspn -L <Hostname>与正常工作的服务器进行比较之后所做的。原来所有有效的实例都没有注册SPN。我真的不知道我在做什么,但是显然如果没有注册这些SPN,就可以使用NTLM。谢谢!
BenderBoy

请注意,如果您想使用Kerberos而不是NTLM,这并不是真正的解决方案,您显然应该这样做:serverfault.com/a/384721。实际上,此解决方案基本上关闭了Kerberos身份验证。
BenderBoy

1

我遇到了同样的问题,但是锁定和解锁机器对我来说很有效。有时,防火墙问题会导致错误。

我不确定它是否对您有用,只是分享我的经验。


1

我在这里尝试了所有解决方案,但都没有成功。一种解决方法是单击“连接”,输入服务器名称,选择“选项”,“连接属性”选项卡。将“网络协议”设置为“命名管道”。这使用户可以使用其网络凭据进行远程连接。得到修复后,我会发布更新。


我实际上将我的设置为“ TCP / IP”。我不知道更改它的行为是否能解决问题或针对我的网络状况的特定设置...
Zarepheth

1

就我而言,问题是在wifi上设置DNS。我删除了设置,将它们留空,然后开始工作。

DNS服务器配置DNS


1

确保从“ SQL Server配置管理器”启用了“命名管道”。这对我有用。

  1. 打开“ SQL Server配置管理器”。
  2. 从左侧列表中展开“ SQL Server网络配置”。
  3. 选择“ [您的实例名称]的协议”。
  4. 右键单击右侧列表中的“命名管道”。
  5. 选择“启用”
  6. 重新启动您的实例服务。

1
我有同样的信息。我试图与IP连接,所以我做了stackoverflow.com/users/8568873/s3minaki,即步骤1-6,但是我启用了TCP / IP而不是命名管道。同样在IPALL下,我清除了TCP动态端口并设置了TCP端口。确保没有其他实例运行此端口,否则该实例将不会重新启动。我还需要一个SQL用户,Windows身份验证将无法工作。在SQL Manager中,您使用xxxx \ instancename,portnr连接。即127.0.0.1 \ SQLEXPRESS,1433
Tomas Hesse


1

在我的情况下,我试图使用集成安全性将一台PC连接到没有域的网络上另一台PC上的SQL Server 。在两台PC上,我都使用相同的Microsoft帐户登录Windows。我在两台PC上都切换到本地帐户,并且SQL Server现在成功连接。


1

就我而言,自从我在开发环境中工作以来,有人关闭了域控制器,并且Windows凭据无法通过身份验证。打开域控制器后,错误消失了,一切正常。


1

网络连接导致此问题的另一个利基。我通过Windows VPN客户端连接,当我从Wifi切换到有线连接时,会弹出此问题。我的情况的解决方法是手动调整适配器指标。

在Powershell中,使用Get-NetIPInterface查看所有度量标准值。较低的数字是较低的成本,因此它们是Windows首选的。我切换了以太网和VPN,凭证就达到了使SSMS满意所需的位置。

若要配置自动度量标准功能,请执行以下操作:在控制面板中,双击“网络连接”。用鼠标右键单击网络接口,然后选择属性。单击“ Internet协议(TCP / IP)”,然后选择“属性”。在常规选项卡上,选择高级。要指定度量标准,请在“ IP设置”选项卡上,选择以清除“自动度量标准”复选框,然后在“接口度量标准”字段中输入所需的度量标准。

来源:https : //docs.microsoft.com/zh-cn/troubleshoot/windows-server/networking/automatic-metric-for-ipv4-routes


0

我遇到了这个问题的一个变种,这里有一些特征:

  • 用户能够成功连接到命名实例,例如,连接Server\Instance成功
  • 用户无法连接到默认实例,例如,与Server由于OP关于SSPI的屏幕截图失败
  • 用户无法使用标准名称连接默认实例,例如,与 Server.domain.com失败(超时)
  • 用户无法在没有命名实例的情况下连接IP地址,例如,到 192.168.1.134失败
  • 不在该域上的其他用户(例如,通过VPN连接到网络的用户)但使用域凭据可以成功连接到默认实例和IP地址

因此,在试图弄清楚为什么这个单一用户无法连接的许多麻烦之后,我们采取了以下步骤来解决此问题:

  1. 使用a查看SPN列表中的服务器
    setspn -l Server
    。就我们而言,它说Server.domain.com
  2. 将条目添加到位于中的主机文件中C:\Windows\System32\drivers\etc\hosts(以管理员身份运行记事本以更改此文件)。我们添加的条目是
    Server.domain.com Server

此后,我们能够通过SSMS成功连接到默认实例。


0

使用Windows身份验证登录时,我在SQL Server 2014上也遇到此问题,以解决该问题,我已经重新启动服务器一次,然后尝试登录,它对我有用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.