我正在努力从机器A到运行SQL Server的机器B获得SQL Server连接。
我已经广泛搜索了所有我发现的东西都没有用。他们也没有引导你逐步解决这个问题。
我们没有使用Kerberos,而是使用配置的NTLM。
涉及的机器是(xx用于隐藏某些机器名称以用于安全目的):
以下SPN已在DC(xxPRODSVR001)上注册。为了安全起见,我用yyy掩盖了域名:
CN = xxDEVSVR002的注册ServicePrincipalNames,CN = Computers,DC = yyy,DC = local:
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的注册ServicePrincipalNames,CN = Computers,DC = yyy,DC = local:
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错误消息更具描述性,并告诉我它尝试连接的主要名称,我可能能够诊断出来。
那么,任何人都可以指导我如何解决这个问题,或者你能看到我所提供的任何错误吗?
我很乐意生成更多调试信息,告诉我你需要什么。
答案 0 :(得分:22)
我遇到了一个我正在处理的ASP.NET MVC应用程序的问题。
我意识到我最近更改了密码,我可以通过注销并重新登录来修复它。
答案 1 :(得分:21)
我花了大约几个小时来解决同样的问题。
事实证明,"Integrated Security=true"
导致了问题。
尝试从连接字符串中删除此参数。
答案 2 :(得分:14)
使用Windows身份验证通过SQL Server Management Studio进行连接时收到此错误。我的密码已过期,但我还没有更改。一旦更改,我就必须退出并重新登录,以便机器使用我的新凭据工作。
答案 3 :(得分:8)
我使用PIN而不是密码登录Windows 10。我退出并使用我的密码重新登录,然后能够通过Management Studio进入SQL Server。
答案 4 :(得分:7)
尝试通过Windows身份验证时遇到了同样的错误。听起来很荒谬,但万一它可以帮助别人:这是因为我的域名帐户在我登录时被某种方式锁定了(!)。解锁帐户修复了它。
答案 5 :(得分:6)
该问题似乎是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”
答案 6 :(得分:5)
只是为这个最不明确的错误添加另一个潜在的解决方案The target principal name is incorrect. Cannot generate SSPI context. (.Net SqlClient Data Provider)
:
验证ping SQL Server时解析的IP是否与Configuration Manager中的IP相同。要检查,请打开SQL Server配置管理器,然后转到SQL Server网络配置> MSSQLServer的协议> TCP / IP。
确保已启用TCP / IP,并在“IP地址”选项卡中,确保在ping时服务器解析为的IP与此处相同。这为我解决了这个错误。
答案 7 :(得分:5)
登录您的SQL Box和您的客户端并输入:
ipconfig /flushdns
nbtstat -R
如果这不起作用,请在客户端计算机上续订DHCP ...这项工作适用于我们办公室的2台PC。
答案 8 :(得分:3)
SSPI上下文错误肯定表明正在尝试使用kerberos进行身份验证。
检查安全事件日志,如果您使用的是kerberos,则应该看到使用身份验证包的登录尝试:Kerberos。
NTLM身份验证可能失败,因此正在进行kerberos身份验证尝试。您可能还会在安全事件日志中看到NTLM登录尝试失败?
你可以打开dev中的kerberos事件记录来尝试调试kerberos失败的原因,尽管它非常冗长。
答案 9 :(得分:3)
就我而言,重新启动SQL Server 2014(在开发服务器上)解决了该问题。
答案 10 :(得分:3)
我正在隔离网络中的一台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上运行该工具,看是否有任何问题 如果状态显示错误,则单击出现的修复按钮。
这为我解决了这个问题。
答案 11 :(得分:3)
这通常是由于缺少,不正确或重复的服务主体名称(SPN)
解决步骤:
setspn -L <ServiceAccountName> | Select-String <ServerName> | select line
确保返回的输出包含SPN,该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>
如果您没有看到以上所有内容,请在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>
此外,如果您收到有关发现重复SPN的消息,则可能要删除它们并重新创建它们
答案 12 :(得分:3)
我刚刚碰到了这个并通过做两件事来修复它:
使用
删除以前存在于SQL Server 计算机帐户上的SPN(而不是服务帐户)setspn -D MSSQLSvc/HOSTNAME.domain.name.com:1234 HOSTNAME
其中 1234 是实例使用的端口号(我的不是默认实例)。
答案 13 :(得分:2)
访问Web应用程序时遇到此问题。可能是因为我最近更改了一个Windows密码。
当我更新了托管Web应用程序的应用程序池的密码时,此问题得到了解决。
答案 14 :(得分:2)
检查客户端和服务器之间的时钟匹配。
当我断断续续地遇到此错误时,以上答案均无济于事,然后我们发现某些服务器上的时间已经过去,一旦它们再次同步,错误就消失了。搜索w32tm或NTP,以了解如何在Windows上自动同步时间。
答案 15 :(得分:1)
此Microsoft工具就像Magic。运行它,将其连接到SQL Server,然后单击“修复”
此处链接的旧版本适用于SQL Server2017。
用于SQL Server的Kerberos配置管理器 https://www.microsoft.com/en-us/download/details.aspx?id=39046
答案 16 :(得分:1)
确保已从“ SQL Server配置管理器”中启用“命名管道”。这对我有用。
答案 17 :(得分:1)
在我的情况下,我试图使用Integrated Security将PC连接到没有域的网络上的另一台PC上的SQL Server。在两台PC上,我都是使用相同的Microsoft帐户登录Windows 。我在两台PC上切换到本地帐户,并且SQL Server现在成功连接。
答案 18 :(得分:1)
就我而言,自从我在开发环境中工作以来,有人关闭了域控制器,并且Windows凭据无法通过身份验证。打开域控制器后,错误消失了,一切正常。
答案 19 :(得分:1)
由网络连接引起的此问题的另一个利基。我通过Windows VPN客户端连接,当我从Wifi切换到有线连接时,会弹出此问题。解决我的情况的方法是手动调整适配器指标。
在powershell中,使用Get-NetIPInterface查看所有度量标准值。较低的数字是较低的成本,因此它们是Windows首选的。我切换了以太网和VPN,凭证就达到了让SSMS满意的位置。
要配置“自动度量”功能: 在控制面板,中双击网络连接。 用鼠标右键单击网络接口,然后选择属性。 单击“ Internet协议(TCP / IP)”,然后选择“属性”。 在常规选项卡上,选择高级。 要指定度量标准,请在“ IP设置”选项卡上,选中以清除“自动度量标准”复选框,然后在“接口度量标准”字段中输入所需的度量标准。
答案 20 :(得分:1)
因为我在寻找解决自己问题的方法时来到这里,所以我会在这里分享我的解决方案,以防其他人也来到这里。
我正好连接到SQL Server,直到我的机器被移动到另一个域上的另一个办公室。然后,在切换之后,我收到有关目标主体名称的错误。修复此问题的方法是使用完全限定名称进行连接,例如: server.domain.com 。实际上,一旦我连接到第一台服务器,我就可以使用服务器名称连接到其他服务器(没有完整的资格),但你的里程可能会有所不同。
答案 21 :(得分:1)
我今天碰到了这个并希望分享我的修复,因为这个只是被忽视并且很容易修复。
我们管理自己的rDNS,最近重新设计了服务器命名方案。作为其中的一部分,我们应该更新我们的rDNS并忘记这样做。
ping出现了正确的主机名,但ping -a返回了错误的主机名。
轻松修复:更改rDNS,执行ipconfig / flushdns,等待30秒(我正在做的事情),再做一次ping -a,看看它解析正确的主机名,连接......利润。
答案 22 :(得分:1)
我为此遇到了一个新的:SQL 2012托管在Server 2012上。 负责为SQL AlwaysOn创建集群 创建群集每个人都获得了SSPI消息。
要解决以下命令运行的问题:
setspn -D MSSQLSvc/SERVER_FQNName:1433 DomainNamerunningSQLService
DomainNamerunningSQLService
==我为SQL设置的域帐户
我需要域管理员来运行命令。群集中只有一台服务器出现问题。
然后重新启动SQL。令我惊讶的是我能够连接。
答案 23 :(得分:1)
我试图在Visual Studio 2015控制台应用程序中从我的笔记本电脑连接到运行SQL Server 2015的VM。我前一天晚上运行我的应用程序,它很好。在早上我尝试调试应用程序,我收到此错误。我尝试了import java.util.*;
import java.io.*;
import java.math.*;
/**
* Auto-generated code below aims at helping you parse
* the standard input according to the problem statement.
**/
class Solution {
public static void main(String args[])
{
Scanner in = new Scanner(System.in);
int n = in.nextInt(); // the number of temperatures to analyse
//Variables declared here below
int[] temps = new int[n];
int closest = 0;
// DO I NEED THIS NEXT BLOCK??!!
//if (in.hasNextLine())
//{
// in.nextLine();
//}
//For loop here, to take the input from in.nextInt()
for (int i = 0; i < n; i++)
{
//int closest = temps[0];
temps[i] = in.nextInt();
closest = Math.abs(temps[0]);
//System.err.println(temps[i]);
if (closest > 0)
{
if (closest > i)
{
closest = i;
}
}
else if (closest < 0)
{
if (closest < i)
{
closest = i;
}
}
}
//String temps = in.nextLine(); // the n temperatures expressed as integers ranging from -273 to 5526
// Write an action using System.out.println()
// To debug: System.err.println("Debug messages...");
System.err.println("Final Results: n = " + n);
System.err.println("Temps are: ");
for (int i = 0; i < n; i++)
{
System.err.println(temps[i]);
}
System.err.println("Closest to zero is " + closest);
System.out.println(closest);
}
}
和ipconfig/flush
+ release
以及一堆其他垃圾,但最后......
重新启动VM并重新启动客户端。这为我解决了这个问题。我应该知道,每次都重启。
答案 24 :(得分:0)
我的问题竟然是如此奇怪和简单:
DOMAIN \ svcAccountA和DOMAIN \ svcAccountB都是我们Active Directory域中的服务帐户。
即使为DOMAIN \ svcAccountA正确设置了所有权限以连接到ServerB,ServerA上的C#CLR(以DOMAIN \ svcAccountA运行)也无法再使用SqlConnection连接到ServerB(相同的奇怪的非提示性错误消息:目标主体名称不正确。无法生成SSPI上下文。
最简单的部分?重新启动ServerA后,SQL Server Windows服务将不再自动启动!这就是发现有人更改了DOMAIN \ svcAccountA的密码的线索,而我不得不在此处更正SQL Server Windows Service配置:
更正密码后,ServerA上的SQL Server Windows服务正常启动,并且ServerA上的C#CLR(以DOMAIN \ svcAccountA运行)现在可以使用SqlConnection连接到ServerB。
答案 25 :(得分:0)
我找到了, Michael Hotek 在 this MSDN post 中回答了这个问题。
<块引用>如果 SQL Server 配置为仅用于 Windows 身份验证,则连接到它的唯一方法是使用您的域凭据。由于您的笔记本电脑上没有域凭据,因此您将无法连接。如果要使用 SQL Server 登录名进行连接,则需要将实例的安全模型更改为 Windows 和 SQL Server 身份验证。然后,您将能够使用标准 SQL Server 登录名而不是域凭据。如果这是不可能的,那么一个非常简单的解决方法是将 VPN 连接到办公室,然后将 RDP 连接到安装了 SQL Server 工具的机器。然后,您将使用您的凭据登录到域中,并且可以在 RDP 进入的机器上直接使用这些工具。
事实证明,如果您不在域中,则必须使用 Mixed mode Auth
。
答案 26 :(得分:0)
连接字符串中的数据库不存在。我以为是,但还没有创建。
答案 27 :(得分:0)
我在 SQL Server 2014 上遇到了同样的问题,我所要做的就是以管理员身份运行应用程序。
答案 28 :(得分:0)
使用人脸识别登录Windows 10时遇到相同的问题。解决方法是按住shift键并右键单击SSMS,然后使用“以其他用户身份运行”并为用户名提供密码。
答案 29 :(得分:0)
更改SQL Server服务用户时遇到此问题。 当它发生在主要实例上时,由于未更新SPN,因此下面的第1点和第2点解决了该问题。
更改命名实例服务用户时,我也遇到此问题。该新用户是主实例已在使用的域帐户。我不知道出了什么问题,但是我这样解决了:
不用说,必须启用防火墙才能清除端口
答案 30 :(得分:0)
在SQL Server防火墙中,为入站和出站打开端口1433、4022、135、1434。对我来说就像魔术一样。
答案 31 :(得分:0)
万一有人想知道,我理清了MS术语:
Target = (active directory) target
Active directory target = target server running the domain controller
Domain controller = server that verifies your login information
Principal name = your windows username
SSPI = security support provider interface
Security support provider interface = software interface that manages "authenticated
communications" and allows SSPs like TLS to allow SSL, among others
SSP = security support provider (SSPI implementation)
TLS/SSL = you should already know this
=无法验证您的密码。
答案 32 :(得分:0)
我遇到了这个问题的一个变种,这是特征:
Server\Instance
的连接成功Server
的连接失败并显示有关SSPI的OP屏幕截图Server.domain.com
的连接失败(超时)192.168.1.134
的连接失败因此,在尝试弄清楚这个单一用户无法连接的原因之后,我们采取了以下步骤来解决这个问题:
setspn -l Server
Server.domain.com
C:\Windows\System32\drivers\etc\hosts
中的hosts文件中添加一个条目(以管理员身份运行记事本以更改此文件)。我们添加的条目是Server.domain.com Server
在此之后,我们能够通过SSMS成功连接到默认实例。
答案 33 :(得分:0)
我遇到了这个问题,它花了大约4-5个小时来找到此错误消息的根本原因。唯一的不同是,我仅从Visual Studio连接数据库而不是通过SQL Server Management Studio直接连接时遇到此错误。
错误背后的原因是,我的应用程序托管在本地IIS上,并且一天前更改了系统密码,但没有将其更新为托管应用程序的IIS应用程序池。
我转到IIS,单击应用程序池,在池列表中右键单击相应的应用程序池,转到“高级设置”,选择“身份”,然后在“自定义帐户”下更改其值(域\帐户名和新密码) ”这解决了我的问题。
谢谢
答案 34 :(得分:0)
我在sql server上遇到了这个问题。我setpn -D mssqlsvc \ Hostname.domainname主机名然后停止并启动我的SQL服务器服务。
我想只是停止并启动我的SQL服务就可以了。
答案 35 :(得分:0)
我在这里尝试了所有的解决方案,但没有一个能够解决。有效的解决方法是单击连接,输入服务器名称,选择选项,连接属性选项卡。将“网络协议”设置为“命名管道”。这允许用户使用其网络凭据进行远程连接。当我得到修复时,我会发布更新。
答案 36 :(得分:0)
在使用Windows身份验证进行日志记录时,我也在SQL Server 2014上遇到此问题,以解决我已重新启动服务器一次然后尝试登录的问题,它对我有用。
答案 37 :(得分:0)
尝试在加入域的Windows 10计算机上通过L2TP VPN连接到我的SQL Server 2017实例时遇到此问题。
问题最终出在我的VPN设置中。在安全设置中的“身份验证”中,使用EAP-MSCHAPv2,在“属性”对话框中,我选择了Automatically use my Windows logon name and password (and domain if any).
我关闭了此功能,然后重新连接了VPN,然后我就能够成功连接到SQL Server。
我认为这导致我的SQL登录名(具有Windows帐户安全性)使用Kerberos而不是NTLM,从而导致SSPI错误。
答案 38 :(得分:0)
只有一个用户在一个SQL Server上出现此错误。原来,他已在Windows凭据下的“控制面板-凭据管理器”中为服务器名称存储了旧密码。删除了存储的凭据,它就起作用了。
答案 39 :(得分:0)
答案 40 :(得分:0)
我将在此处添加它,因为它吸引了我,并可能会帮助其他人。请注意,我不是Windows使用者,但必须查看包含SQL Server的方案。
我下载了完整的SQL Server产品的开发人员版本并将其安装在Windows 10上。所有这些都对本地连接有好处,对远程客户端没有好处。
尝试了许多上述操作,但最终我意识到Windows身份验证想要对remoteclient \ myuser进行身份验证,并且在独立的Windows世界中没有办法创建针对该身份验证的机制(据我所知,是kerberos)。错误消息为“无法生成SSPI上下文”。
使用SQL身份验证似乎也不起作用。
我最终回到具有组合模式的SQL Server Express,然后可以从远程客户端使用SQL身份验证。
答案 41 :(得分:0)
我有同样的问题,但锁定和解锁机器对我有用。有时,防火墙问题会产生错误。
我不确定这对你有用,只是分享我的经验。
答案 42 :(得分:0)
根本不是理想的解决方案,我只是想添加此内容以供以后查看此页面的任何人参考:
我在尝试使用我的域帐户连接到远程SQL Server实例时遇到了这个问题,在另一台计算机上托管的实例上尝试相同的操作可以正常工作。
因此,如果您可以选择仅使用其他实例,则可能会有所帮助,但这实际上无法解决任何问题。
答案 43 :(得分:0)
我有同样的问题。我最近更改了我的Windows密码,我的网站丢失了错误。我试图注销并登录但没有工作。然后我意识到我在“自定义帐户”部分使用我的帐户配置了defaultappppol
,并使用新密码再次配置了帐户。这太神奇了!!!请告诉我您对此解决方案的反馈意见。
答案 44 :(得分:0)
似乎问题与DNS服务器有关。 要解决此问题,请将IP地址更改为ComputerName。
实施例: 更改值&#34; 10.0.0.10 \ TestDB&#34;到&#34; YourcomputerName \ TestDB&#34;
答案 45 :(得分:0)
我正在运行基于SQL.COM的米老鼠测试系统。
我在我无法连接的机器和我可以使用的机器上运行setspn -T sql -F -Q */Servername
(在本例中为SQL01)。然后,我只是删除问题机器中的其他条目,这一切都有效,例如setspn -D MSSQLSvc/SQL01.SQL.COM:1433 SQL01
答案 46 :(得分:-1)
请检查SQL server management studio中提到的登录名的权限,勾选sysadmin复选框,然后在.config文件中生成Integrated Security=False
。
客户端计算机上的Fire 2命令
ipconfig / flushdns
klist purge。
在客户端计算机上安装kerbarose配置管理器。
最后,重新启动客户端计算机和主SQL服务器服务。在客户端计算机上运行该应用程序。这100%正确工作。
答案 47 :(得分:-2)
groupBy
在$data = \App\Logs::select('id', 'created_at')
->get()
->groupBy(function($val) {
return Carbon::parse($val->created_at)->format('d-M-');
})
->transform(function ($collection, $key) {
return $collection->count();
});
连接字符串中将此标志设为false。它会工作!