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

时间:2017-10-12 07:36:56

标签: sql-server authentication kerberos windows-integrated-auth spn

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

  

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

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

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

  

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

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

  

SetSPN -d“MSSQLSvc / FQDN”“domain \ machine $”

     

SetSPN -s“MSSQLSvc / FQDN”“domain \ administrator”

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

感谢。

1 个答案:

答案 0 :(得分:1)

在本地系统帐户下运行时,会为自动控制的每项服务注册一个,并在服务关闭时尝试取消注册。{3}}本地系统帐户能够通过网络作为计算机帐户进行通信,因此可以向Active Directory指示何时对其自身进行更改以及SPN SQL服务是否要注册。当您将SQL Server帐户更改为AD域用户帐户时,本地系统帐户立即失去控制它的能力;因此,在注册新SPN之前,必须手动删除以前由本地系统为该SQL服务注册的现有SPN。您现在应该注意到为什么SQL服务器脚本有助于删除旧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相关 - 而不是任何其他身份验证协议。