sql-server - 为什么当 SQL Server 服务在本地系统帐户下运行时,我的 Windows 服务仅与数据库建立连接?

标签 sql-server authentication kerberos windows-authentication spn

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

The target principal name is incorrect. Cannot generate SSPI context.

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

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

Note: Once when my windows service works fine and I revert the SQL Server run under the admin account my service runs fine. I guess there are some permissions are set to the local system account.

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

SetSPN -d "MSSQLSvc/FQDN" "domain\machine$"

SetSPN -s "MSSQLSvc/FQDN" "domain\administrator"

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

最佳答案

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

请参阅此 Microsoft 文档以进一步阅读有关该主题的内容:Register a Service Principal Name for Kerberos Connections 。还有一个非常好的youtube video关于这个确切的问题,这就是我了解它以及如何解决它的地方。忽略标题中的“SSRS”,我已观看全文,该指南适用于具有 SPN 的 SQL 的任何和所有服务。

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

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

关于sql-server - 为什么当 SQL Server 服务在本地系统帐户下运行时,我的 Windows 服务仅与数据库建立连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46703976/

相关文章:

PHP/MySQL 登录 -> 每个客户的模式

symfony - 使用 Symfony2 的 Kerberos 身份验证

sql-server - 计算总返回率 0

SQL 对层次结构中的节点重新排序

SQL Server 索引排序

hadoop - 让 Hadoop 以 Kerberos 用户身份运行

performance - Hadoop 集群 - 正常集群和安全集群之间的性能差异

c# - 到本地的 Azure VPN 无法从 azure Web 应用程序连接 SQL Server

ruby-on-rails - 从 Restful 身份验证迁移到 Devise

facebook - 我可以使用 Facebook 凭据让用户访问我的网站吗?