サービス プリンシパル名の構成の状態

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 データベース エンジンのサービス プリンシパル名 (SPN) が見つからないか、間違っているか、ドメインの Active Directory で構成されている他の SPN と重複している可能性があります。

注: 間違っている SPN は、Active Directory の間違ったアカウントで構成された SPN です。

解決方法

setspn.exe および klist.exe プログラムを使用して問題を解決できることがあります。

どちらのツールも Windows Server 2008 以降に付属しています。以前のバージョンの Windows では、Microsoft ダウンロード センターから別途ダウンロードするか、Windows サポート ツール パッケージから取得する必要があります。

ケース 1: 不足している SPN を解決する方法

1. 次のコマンドを実行して不足している SPN を追加します。

setspn –S <SPN> <アカウント>

2. クライアント アプリケーションを使用して SQL Server に再接続を試みます。

setspn コマンドにおいて /S または –A パラメーターを使用することもできます。後者は使用されなくなりますが、Windows Server の古いバージョン (2012, 2012 R2) ではまだ使用することができます。

仮想アカウント (たとえば、ローカル システムまたは NT Service\MSSQL Server) を使用した場合は、setspn コマンドの <Account> 値は、コンピューター ホスト名で提示される必要があります。

または、SQL サービス アカウントに適切なアクセス許可を与え、SQL が必要な SPN を自動的に生成できるようにします。

注: SPN が欠落していても接続失敗という結果にはなりませんが、アプリケーションは Kerberos 認証を使用できなくなります。

ケース 2: 間違っている SPN を解決する方法

1. 次のコマンドを実行して間違っている SPN を削除します。

setspn –D <SPN> <Account>

2. クライアント コンピューターで、ログオフして再度ログインするか、次のコマンドを実行して、Kerberos チケットのキャッシュを消去します。

klist による消去

3. クライアント アプリケーションを使用して SQL Server に再接続を試みます。

注: アプリケーションから Kerberos を使用するには、前のケース 1 の解決策を使用して正しい SPN を構成する必要があります。

ケース 3: 重複している SPN を解決する方法

1. 重複していて削除する必要がある SPN を特定します。

2. 次のコマンドを実行して、重複している各 SPN を削除します。

setspn –D <SPN> <Account>

3. クライアント コンピューターで、ログオフして再度ログインするか、次のコマンドを実行して、Kerberos チケットのキャッシュを消去します。

klist による消去

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 を使用して認証できません。
サービス プリンシパル名 (SPN) が不足しているか、間違っているか、重複しているため、SQL Server は Kerberos を使用して認証できません。
サービス アカウント: {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>