服务主体名称配置状态

Microsoft.SQLServer.Windows.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 –S <SPN> <帐户>

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

你还可以使用 /S 或–A 参数来执行 setspn 命令。尽管后者被认为是过时的,但它仍可以在旧版的 Windows Server 版本(2012、2012 R2)中运行。

请注意,如果使用虚拟帐户(如本地系统或 NT 服务\MSSQL Server),则应由计算机主机名显示 setspn 命令的 <Account> 值。

或者,您可以向 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。

可替代参数

名称

说明

默认值

警报优先级

定义警报优先级。

正常

警报严重性

定义警报严重性。

警告

已启用

启用或禁用工作流。

生成警报

定义工作流是否生成警报。

间隔(秒)

运行工作流的重复间隔时间(秒)。

900

搜索范围

当搜索范围为域或组织单元时,使用 LDAP 搜索。 当搜索范围为林时,可通过使用全局编录 (GC) 搜索在任何分区内解析查询。 值列表: LDAP GC

LDAP

同步时间

使用 24 小时格式指定的同步时间。可以忽略。

 

超时(秒)

指定工作流在关闭之前允许运行的时间,并标记为失败。

300

Element properties:

TargetMicrosoft.SQLServer.Windows.LocalDBEngine
Parent MonitorSystem.Health.ConfigurationState
CategoryAvailabilityHealth
EnabledTrue
Alert GenerateTrue
Alert SeverityWarning
Alert PriorityNormal
Alert Auto ResolveTrue
Monitor TypeMicrosoft.SQLServer.Windows.DBEngine.Configuration.SPNStatus
RemotableTrue
AccessibilityPublic
Alert Message
Windows 上的 MSSQL: SQL Server 无法使用 Kerberos 进行身份验证,因为服务主体名称(SPN)缺失、错误放置或重复。
SQL Server 无法使用 Kerberos 进行身份验证,因为服务主体名称(SPN)缺失、错误放置或重复。
服务帐户: {0}
缺失的 SPN: {1}
错误放置的 SPN: {2}
重复的 SPN: {3}
RunAsDefault

Source Code:

<UnitMonitor ID="Microsoft.SQLServer.Windows.DBEngine.Configuration.SPNStatusMonitor" Accessibility="Public" Enabled="true" Target="SqlDiscW!Microsoft.SQLServer.Windows.LocalDBEngine" ParentMonitorID="Health!System.Health.ConfigurationState" Remotable="true" Priority="Normal" TypeID="Microsoft.SQLServer.Windows.DBEngine.Configuration.SPNStatus" ConfirmDelivery="false">
<Category>AvailabilityHealth</Category>
<AlertSettings AlertMessage="Microsoft.SQLServer.Windows.DBEngine.Configuration.SPNStatusMonitor.AlertMessage">
<AlertOnState>Warning</AlertOnState>
<AutoResolve>true</AutoResolve>
<AlertPriority>Normal</AlertPriority>
<AlertSeverity>Warning</AlertSeverity>
<AlertParameters>
<AlertParameter1>$Data/Context/Property[@Name='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>
<MachineName>$Target/Property[Type="SqlCoreLib!Microsoft.SQLServer.Core.DBEngine"]/MachineName$</MachineName>
<InstanceName>$Target/Property[Type="SqlCoreLib!Microsoft.SQLServer.Core.DBEngine"]/InstanceName$</InstanceName>
<ConnectionString>$Target/Property[Type="SqlCoreLib!Microsoft.SQLServer.Core.DBEngine"]/ConnectionString$</ConnectionString>
<MonitoringType>$Target/Property[Type="SqlDiscW!Microsoft.SQLServer.Windows.DBEngine"]/MonitoringType$</MonitoringType>
<SqlTimeoutSeconds>15</SqlTimeoutSeconds>
<TimeoutSeconds>300</TimeoutSeconds>
<IntervalSeconds>900</IntervalSeconds>
<SyncTime/>
<PrincipalName>$Target/Property[Type="SqlDiscW!Microsoft.SQLServer.Windows.DBEngine"]/PrincipalName$</PrincipalName>
<SearchScope>LDAP</SearchScope>
</Configuration>
</UnitMonitor>