【问题标题】:SetSPN unable to locate accountSetSPN 找不到账号
【发布时间】:2017-04-21 18:45:45
【问题描述】:

我在 Windows Server 2012 R2 上安装了 SQL Server 2014,它也是一个 AD DC。当我尝试使用 SQL Server Management Studio (SSMS) 从同一本地域上的客户端桌面连接到它时,我收到以下错误消息:

The target principal name is incorrect. Cannot generate SSPI context. (Microsoft SQL Server)

因此,在关于同一问题的其他帖子之后,我在 SQL 服务器上下载了 Kerberos 配置管理器,发现 2 Misplaced SPN。 Kerberos 配置管理器提出的 SPN Script 命令如下:

SetSPN -d "MSSQLSvc/SERVERNAME.internal.domain.com" "internal\SERVERNAME$"
SetSPN -s "MSSQLSvc/SERVERNAME.internal.domain.com" "DOMAIN\SERVERNAME$"

但是当我尝试在服务器上运行 cmd 中的第一个命令(“SetSPN -d”命令)时,我收到了这个错误:

FindDomainForAccount: Call to DsGetDcNameWithAccountW failed with return value 0x0000054B
Unable to locate account SERVERNAME$

我不确定如何从这里继续前进。谷歌搜索并没有找到正确的答案。请帮忙。问题是:

1) 错位的 SPN 是罪魁祸首吗?如果有,如何改正?

2) 如果没有,我如何使用 Windows 身份验证从同一本地域上的客户端桌面连接到 SQL Server?

【问题讨论】:

  • SQL登录访问有问题吗?您在本地访问是否有问题,您 RDP 到那个 Windows 框,打开 SSMS,Windows 身份验证,打开选项将网络协议从默认更改为 tcp?
  • @Wendy 本地访问没问题。我在服务器本身上安装了 SSMS 并且可以正常工作。当我尝试在客户端 Windows 桌面上使用 SQL 登录名(用户名/密码)登录时,它只显示Cannot connect to SERVERNAME. Login failed for user 'xxx'。当我在本地使用 SSMS 并右键单击服务器名称时,属性 -> 连接:允许远程连接到此服务器已启用。在 Sql Server 配置管理器中,SQL Server Network Configuration -> Protocals for SERVERNAME 启用了 TCP/IP ...我还应该尝试什么?谢谢!
  • 本地访问时,SSMS没有使用TCP连接SQL Server。 '连接到服务器',有选项>>按钮,将网络协议从默认更改为tcp。如果您能够进入。检查用户'xxx'是否具有访问权限,如果没有添加并授予权限然后尝试远程使用此用户ID访问权限。
  • @Wendy 如果我在本地启动 SSMS,我会在 Security->Logins 中看到 xxx,并且具有公共和系统管理员角色。当我单击远程 SSMS 中的选项 >> 按钮时,网络协议将 作为 only 选项(下拉菜单没有其他选择)...
  • 对不起,帮不了你太多。远程 SQL 和 Windows 身份验证均失败。请检查一个。 Windows 事件日志和 SQL 日志的更多信息。湾。 SQL Server 配置,在 SQL Server 网络和 SQL 本机网络下,都启用了 tcp/ip? c.这是默认 SQL Server 实例还是命名实例?

标签: sql-server kerberos sspi


【解决方案1】:

确保您从已加入 Active Directory 域的计算机运行脚本,并且该计算机的 DNS 正确解析为 AD。要查找 SERVERNAME$,机器需要向 DNS 询问要查询的 Active Directory 域控制器的位置。 SPN 脚本也是错误的。

  1. 去掉引号,在这种情况下不需要它们,特别是考虑到没有嵌入的空格要括起来。

  2. 确保您已登录到内部以运行第一个命令。第二个命令在登录 DOMAIN 时运行。

    我认为建议的脚本是:

SetSPN -d "MSSQLSvc/SERVERNAME.internal.domain.com" "internal\SERVERNAME$"
SetSPN -s "MSSQLSvc/SERVERNAME.internal.domain.com" "DOMAIN\SERVERNAME$"

应该是这样的:

SetSPN -d MSSQLSvc/SERVERNAME.internal.domain.com internal\SERVERNAME$
SetSPN -s MSSQLSvc/SERVERNAME.internal.domain.com DOMAIN\SERVERNAME$

我刚刚在我的环境中测试了第二行并且它有效。我不需要混淆我的测试环境,所以它实际上是以下内容:

SetSPN -s MSSQLSvc/dc1.dev.local DEV\dc1$

...结果:

Checking domain DC=dev,DC=local

    Registering ServicePrincipalNames for CN=DC1,OU=Domain Controllers,DC=dev,DC=local
            MSSQLSvc/dc1.dev.local
    Updated object
    
    C:\>

【讨论】:

  • 我实际上是在 SQL Server 上本地运行 Keberos 配置管理器(这也是 AD DC - 不理想,但这是我的设置),因此我也在本地运行建议的脚本。
  • 逗号是错字,已更正。我删除了部分域名混淆。第一级实际上是“内部”,而有问题的命令(带有 -d 的命令)将“内部”作为域名(这是奇怪的部分)。第二个命令 (-s) 始终运行良好且从未出现问题 - 但仅此一项并不能解决我的 misplaced SPN 问题...
  • 相应地编辑了答案。确保您已登录到 internal 域以运行第一个命令。
  • 原来internal.domain.comDOMAIN 是同一个域,后者是后者的“pre-Windows 2000”名称。因此,当我拼出完整的域名时,它可以删除:SetSPN -d "MSSQLSvc/SERVERNAME.internal.domain.com" "internal.domain.com\SERVERNAME$"。但是,在我运行第二个命令后,Kerberos 配置管理器抱怨同样的问题:“错位的 SPN”。我运行“SetSPN -L”并确认internal.domain.com\SERVERNAME$DOMAIN\SERVERNAME$ 两个帐户具有完全相同的SPN 列表。所以我想知道放错地方的问题是否不重要......
  • 我的 IPv4 设置错误,域 srv ip 设置不正确,您的提示解决了我的问题。
【解决方案2】:

根据我对@T-Heron 回答的最后一条评论,internal\SERVERNAME$ 帐户确实 存在。它应该是internal.domain.com\SERVERNAME$,与DOMAIN\SERVERNAME$ 是同一个帐户,其中DOMAINinternal.domain.com 的Windows 2000 之前的名称。

因此,Kerberos 配置管理器识别的 misplaced SPN 不是初始错误消息的根本原因:The target principal name is incorrect. Cannot generate SSPI context. (Microsoft SQL Server)

最初问题的解决方案来自this post,在客户端和服务器端都执行了几个步骤来解决问题。

【讨论】:

    猜你喜欢
    • 2018-10-27
    • 1970-01-01
    • 2021-10-06
    • 2021-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-29
    • 1970-01-01
    相关资源
    最近更新 更多