服務主體名稱組態狀態

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

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

Knowledge Base article:

摘要

此監視器會查看 Microsoft SQL Server 執行個體的服務主體名稱 (SPN) 的組態。此作業藉由比較 SQL Server 服務與網域控制站組態加以完成。

Note that the monitor is always in "Healthy" state for non-domain joined machines.

原因

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 –S <SPN> <帳戶>

2. 利用用戶端應用程式嘗試重新連接到 SQL Server。

您也可以將 /S 或 -A 參數用於 setspn 命令。雖然後者即將淘汰,但仍可在較舊的 Windows Server 版本 (2012、2012 R2) 中使用。

請注意,如果使用虛擬帳戶 (像是本機系統帳戶或 NT Service\MSSQL Server),電腦主機名稱應會顯示 setspn 命令的 <帳戶> 值。

或者,您可以提供適當的權限給 SQL 服務帳戶,讓 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.2016.DBEngine
Parent MonitorSystem.Health.ConfigurationState
CategoryAvailabilityHealth
EnabledTrue
Alert GenerateTrue
Alert SeverityWarning
Alert PriorityNormal
Alert Auto ResolveTrue
Monitor TypeMicrosoft.SQLServer.2016.DBEngine.Configuration.SPNStatus
RemotableTrue
AccessibilityPublic
Alert Message
MSSQL 2016: 因為服務主體名稱 (SPN) 遺失、錯置或重複,所以 SQL Server 無法使用 Kerberos 進行驗證。
SQL Server 無法使用 Kerberos 進行驗證,因為服務主要名稱 (SPN) 遺漏、錯置或重複。
服務帳戶: {0}
遺漏的 SPN: {1}
錯置的 SPN: {2}
重複的 SPN: {3}
RunAsDefault

Source Code:

<UnitMonitor ID="Microsoft.SQLServer.2016.DBEngine.Configuration.SPNStatusMonitor" Accessibility="Public" Enabled="true" Target="SQL2016Core!Microsoft.SQLServer.2016.DBEngine" ParentMonitorID="SystemHealth!System.Health.ConfigurationState" Remotable="true" Priority="Normal" TypeID="Microsoft.SQLServer.2016.DBEngine.Configuration.SPNStatus" ConfirmDelivery="false">
<Category>AvailabilityHealth</Category>
<AlertSettings AlertMessage="Microsoft.SQLServer.2016.DBEngine.Configuration.SPNStatusMonitor.AlertMessage">
<AlertOnState>Warning</AlertOnState>
<AutoResolve>true</AutoResolve>
<AlertPriority>Normal</AlertPriority>
<AlertSeverity>Warning</AlertSeverity>
<AlertParameters>
<AlertParameter1>$Target/Property[Type="SQL2016Core!Microsoft.SQLServer.2016.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="SQL2016Core!Microsoft.SQLServer.2016.ServerRole"]/InstanceName$</InstanceName>
<Account>$Target/Property[Type="SQL2016Core!Microsoft.SQLServer.2016.DBEngine"]/Account$</Account>
<ServiceName>$Target/Property[Type="SQL2016Core!Microsoft.SQLServer.2016.DBEngine"]/ServiceName$</ServiceName>
<IntervalSeconds>900</IntervalSeconds>
<SyncTime/>
<TimeoutSeconds>300</TimeoutSeconds>
<SearchScope>LDAP</SearchScope>
</Configuration>
</UnitMonitor>