服务主体名称配置状态

Microsoft.SQLServer.2008.DBEngine.Configuration.SPNStatusMonitor (UnitMonitor)

此监视器检查 Microsoft® SQL Server™ 实例服务主体名称配置的状态。

Knowledge Base article:

摘要

此监视器检查 Microsoft® SQL Server™ 实例的服务主体名称(SPN)的配置。这是通过将 SQL Server 服务和域控制器配置进行比较实现的。

原因

SQL Server 数据库引擎的服务主体名称 (SPN) 可能缺失、错误放置或者与域的 Active Directory 中配置的其他 SPN 重复。

注意: 错误放置的 SPN 是在 Active Directory 中的错误帐户上配置的 SPN。

解决方法

可以使用 setspn.exeklist.exe 程序解决该问题。

在 Windows Server 2008 和更高版本中随附这两种工具。对于之前的 Windows 版本,您可能需要单独从 Microsoft 下载中心下载这两种工具,或者从 Windows 支持工具包获取它们。

情况 1: 如何解决缺失的 SPN:

1.运行以下命令以便添加缺失的 SPN:

setspn –A <SPN> <帐户>

2.尝试使用您的客户端应用程序重新连接到 SQL Server。

或者,您可以向 SQL Service 帐户提供正确权限,以便允许 SQL 自动生成所需的 SPN。

注意: 缺失的 SPN 可能不会导致连接失败,但将阻止应用程序使用 Kerberos 身份验证。

情况 2: 如何解决错误放置的 SPN:

1.运行以下命令以解决错误放置的 SPN:

setspn –D <SPN> <帐户>

2.在客户端计算机上,或者注销后重新登录,或者通过运行以下命令清除 Kerberos 票证缓存:

klist purge

3.尝试使用您的客户端应用程序重新连接到 SQL Server。

注意: 如果您想要从您的应用程序使用 Kerberos,则需要使用上面的情况 1 中的解决方法配置正确的 SPN。

情况 3: 如何解决重复的 SPN:

1.标识重复并且必须删除的 SPN。

2.运行以下命令以删除每个重复的 SPN:

setspn –D <SPN> <帐户>

3.在客户端计算机上,或者注销后重新登录,或者通过运行以下命令清除 Kerberos 票证缓存:

klist purge

4.尝试使用您的客户端应用程序重新连接到 SQL Server。

外部

如果错误配置 SPN,您可能会遇到针对 SQL Server 的连接问题

Element properties:

TargetMicrosoft.SQLServer.2008.DBEngine
Parent MonitorSystem.Health.ConfigurationState
CategoryAvailabilityHealth
EnabledTrue
Alert GenerateTrue
Alert SeverityWarning
Alert PriorityNormal
Alert Auto ResolveTrue
Monitor TypeMicrosoft.SQLServer.2008.DBEngine.Configuration.SPNStatus
RemotableTrue
AccessibilityPublic
Alert Message
SQL Server 无法使用 Kerberos 进行身份验证,因为服务主体名称(SPN)缺失、错误放置或重复。


SQL Server 无法使用 Kerberos 进行身份验证,因为服务主体名称(SPN)缺失、错误放置或重复。
服务帐户: {0}
缺失的 SPN: {1}
错误放置的 SPN: {2}
重复的 SPN: {3}
RunAsDefault

Source Code:

<UnitMonitor ID="Microsoft.SQLServer.2008.DBEngine.Configuration.SPNStatusMonitor" Accessibility="Public" Enabled="true" Target="SQL2008Core!Microsoft.SQLServer.2008.DBEngine" ParentMonitorID="SystemHealth!System.Health.ConfigurationState" Remotable="true" Priority="Normal" TypeID="Microsoft.SQLServer.2008.DBEngine.Configuration.SPNStatus" ConfirmDelivery="false">
<Category>AvailabilityHealth</Category>
<AlertSettings AlertMessage="Microsoft.SQLServer.2008.DBEngine.Configuration.SPNStatusMonitor.AlertMessage">
<AlertOnState>Warning</AlertOnState>
<AutoResolve>true</AutoResolve>
<AlertPriority>Normal</AlertPriority>
<AlertSeverity>Warning</AlertSeverity>
<AlertParameters>
<AlertParameter1>$Target/Property[Type="SQL!Microsoft.SQLServer.DBEngine"]/Account$</AlertParameter1>
<AlertParameter2>$Data/Context/Property[@Name='MissingSpnList']$</AlertParameter2>
<AlertParameter3>$Data/Context/Property[@Name='MisplacedSpnList']$</AlertParameter3>
<AlertParameter4>$Data/Context/Property[@Name='DuplicateSpnList']$</AlertParameter4>
</AlertParameters>
</AlertSettings>
<OperationalStates>
<OperationalState ID="Good" MonitorTypeStateID="Good" HealthState="Success"/>
<OperationalState ID="Bad" MonitorTypeStateID="Bad" HealthState="Warning"/>
</OperationalStates>
<Configuration>
<ComputerNetworkName>$Target/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/NetworkName$</ComputerNetworkName>
<NetbiosComputerName>$Target/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/NetbiosComputerName$</NetbiosComputerName>
<InstanceName>$Target/Property[Type="SQL!Microsoft.SQLServer.ServerRole"]/InstanceName$</InstanceName>
<Account>$Target/Property[Type="SQL!Microsoft.SQLServer.DBEngine"]/Account$</Account>
<ServiceName>$Target/Property[Type="SQL!Microsoft.SQLServer.DBEngine"]/ServiceName$</ServiceName>
<IntervalSeconds>900</IntervalSeconds>
<SyncTime/>
<TimeoutSeconds>300</TimeoutSeconds>
<SearchScope>LDAP</SearchScope>
</Configuration>
</UnitMonitor>