服務主體名稱組態狀態

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

此監視器會檢查 Microsoft® SQL Server™ 執行個體服務主體名稱組態的狀態。

Knowledge Base article:

摘要

此監視器會檢查 Microsoft® SQL Server™ 執行個體之服務主體名稱 (SPN) 的組態。其檢查方式是比較 SQL Server 服務與網域控制站組態。

原因

SQL Server Database Engine 的服務主體名稱 (SPN) 可能遺失、錯置或與網域 Active Directory 中設定的其他 SPN 重複。

注意:錯置的 SPN 是指在 Active Directory 中錯誤帳戶上設定的 SPN。

解決方式

setspn.exeklist.exe 程式可用來解決此問題。

這兩個工具隨附於 Windows Server 2008 和更新版本中。若為舊版 Windows,您可能必須另外從 Microsoft 下載中心下載這些工具,或透過 Windows 支援工具套件取得這些工具。

案例 1:如何解決遺失的 SPN:

1.執行下列命令以加入遺失的 SPN:

setspn –A <SPN> <Account>

2.嘗試使用您的用戶端應用程式來重新連接到 SQL Server。

或者,您可以提供適當的權限給 SQL 服務帳戶,讓 SQL 自動產生所需的 SPN。

注意:遺失的 SPN 可能不會導致連線失敗,但是會讓應用程式無法使用 Kerberos 驗證。

案例 2:如何解決錯置的 SPN:

1.執行下列命令以移除錯置的 SPN:

setspn –D <SPN> <Account>

2.在用戶端電腦上,登出並重新登入,或執行下列命令以清除 Kerberos 票證快取:

klist purge

3.嘗試使用您的用戶端應用程式來重新連接到 SQL Server。

注意:如果您想要從應用程式使用 Kerberos,就必須使用上述案例 1 的解決方式來設定正確的 SPN。

案例 3:如何解決重複的 SPN:

1.識別重複且必須移除的 SPN。

2.執行下列命令以移除每個重複的 SPN:

setspn –D <SPN> <Account>

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>