2

我的 Windows 服务使用集成身份验证并在本地系统帐户下运行,并得到以下异常。

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

SQL Server 服务在域管理员用户下运行,例如“域\管理员”。如果我将 SQL Server 服务更改为在本地系统帐户下运行,则它可以修复上述错误。

谁能解释为什么会这样?我们有一个 InstallShield 向导,它在客户端安装我们的应用程序,我不知道我们如何通过向导处理这种行为。此外,更改 SQL Server 服务的用户也不现实,因为客户端可能不允许这样做。

注意:一旦我的 Windows 服务正常运行并且我恢复在管理员帐户下运行的 SQL Server,我的服务运行正常。我猜有一些权限设置为本地系统帐户。

在此之前,我运行了 Kerberos,它生成了以下脚本来运行并修复了该问题。在此之后,不需要更改 SQL Server 服务的用户。

SetSPN -d "MSSQLSvc/FQDN" "域\机器$"

SetSPN -s "MSSQLSvc/FQDN" "域\管理员"

请解释为什么会发生这种情况以及处理这种情况的最佳方法是什么?

4

1 回答 1

3

在本地系统帐户下运行时,为它自动控制的每个服务注册一个,并在服务关闭时尝试取消注册它们。本地系统帐户能够作为计算机帐户通过网络进行通信,因此可以向 Active Directory 指示何时对其自身进行更改以及 SPN SQL 服务想要注册。当您将 SQL Server 帐户更改为 AD 域用户帐户时,本地系统帐户将立即失去对其进行控制的能力;因此,您必须先手动删除本地系统之前为该 SQL 服务注册的现有 SPN注册新的 SPN。您现在应该注意到为什么 SQL 服务器脚本有助于删除旧的 SPN,然后注册一个新的 SPN 以防止出现问题,这很好。如果没有正确完成 - 当 kerberos 客户端获取旧的无效 SPN 的票证时,您将收到身份验证错误 - 因为它从未被删除,并且任何 Kerberos 感知服务将始终拒绝错误 SPN 的票证。进行 SPN 更改后,请务必重新启动 SQL Server 服务,然后如果您正在使用用户进行测试,请让该用户注销并重新登录。这在这里回答了您的主要问题。

请参阅此 Microsoft 文档以进一步阅读该主题:为 Kerberos 连接注册服务主体名称。还有一个关于这个确切问题的非常好的 youtube视频,这就是我了解它以及如何解决它的地方。忽略标题中的“SSRS”,我已经观看了全部内容,并且该指南适用于具有 SPN 的 SQL 提供的任何和所有服务。

在问题的最后,您有一个次要问题,即处理这种情况的最佳方法是什么。如果您正在谈论以编程方式解决它,那将很难回答,因为所有环境都以某种方式不同,并且您会遇到在各种不同的安全上下文中运行的 SQL 实例。在这样的在线论坛中,您可能会从不同的人那里得到不同的答案。如果这是您唯一的问题,我认为它会被版主关闭,因为“主要基于意见”并且可能会吸引垃圾邮件答案。我建议您在某种形式的自述文件中包含有关该问题的某种指导,您应该将其与 InstallShield 向导一起打包。

旁注:我认为您应该将标记添加到此问题 - 因为 SPN 仅与 Kerberos 相关 - 而与任何其他身份验证协议无关。

于 2017-11-26T00:44:21.323 回答