首页 文章

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

提问于
浏览
1

我的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 回答

  • 1

    在本地系统帐户下运行时,sql-server为其自动控制的每个服务注册spn,最多为active-directory,并在服务关闭时尝试取消注册 . 本地系统帐户能够通过网络作为计算机帐户进行通信,因此可以向Active Directory指示何时对其自身进行更改以及SPN SQL服务是否要注册 . 当您将SQL Server帐户更改为AD域用户帐户时,本地系统帐户立即失去控制它的能力;因此,在注册新SPN之前,必须手动删除本地系统先前为该SQL服务注册的现有SPN . 您现在应该注意到为什么SQL服务器脚本有助于删除旧SPN,然后注册新SPN以防止出现问题 . 当kerberos客户端获取旧的无效SPN的故障单时,如果没有't done properly - you' ll会收到身份验证错误 - 因为它从未被删除,并且任何支持Kerberos的服务将始终拒绝错误SPN的故障单 . 在进行SPN更改后,请务必重新启动SQL Server服务,如果您正在测试用户,请让该用户注销并重新登录 . 这将在此处回答您的主要问题 .

    有关此主题的进一步阅读,请参阅此Microsoft文档:Register a Service Principal Name for Kerberos Connections . 对于这个确切的问题,还有一个非常好的youtube video,'s where I learned about it and how to resolve it. Ignore 2407748 in the title, I' ve观看了整体,并且指导适用于具有SPN的SQL的任何和所有服务 .

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

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

相关问题