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

Why my Windows service only establishes connection with database when SQL Server Service runs under Local System account?

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

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

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

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

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 服务器服务的用户。

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

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

请解释为什么会这样,处理这种情况的最佳方法是什么?

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

请参阅此 Microsoft 文档以进一步阅读该主题:Register a Service Principal Name for Kerberos Connections. There's also a very good youtube video 关于这个确切的问题,这是我了解它以及如何解决它的地方。忽略标题中的 "SSRS",我已经看完了全部内容,该指南适用于 SQL 提供的具有 SPN 的所有服务。

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

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