1

我的windows服务正在使用集成身份验证并在本地系统帐户下运行,并得到以下异常。为什么当SQL Server服务在本地系统帐户下运行时,我的Windows服务仅与数据库建立连接?

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

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

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

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

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

的SetSPN -D “为MSSQLSvc/FQDN” “域\机器$”

的SetSPN -s “为MSSQLSvc/FQDN” “域\管理员”

请解释为什么它的发生和什么处理这种情况的最佳方式是什么?

谢谢。

回答

0

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

请参阅关于这个问题的进一步阅读本文档微软:Register a Service Principal Name for Kerberos Connections。在这个确切的问题上,还有一个很好的youtube video,这是我了解它和如何解决它的地方。忽略标题中的“SSRS”,我已经看到了整体,并且指导适用于SQL中具有SPN的任何和所有服务。

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

附注:我认为你应该在此问题上添加标签 - 因为SPN只与Kerberos相关 - 而不是任何其他身份验证协议。

相关问题