서비스 사용자 이름 구성 상태

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.exeklist.exe 프로그램을 사용하면 이 문제를 해결할 수 있습니다.

두 도구 모두 Windows Server 2008 이상에서 제공됩니다. 이전 버전의 Windows에서는 Microsoft Download Center에서 별도로 다운로드하거나 Windows 지원 도구 패키지에서 가져와야 할 수 있습니다.

사례 1: 누락된 SPN 해결 방법:

1. 다음 명령을 실행하여 누락된 SPN을 추가합니다.

setspn –S <SPN> <계정>

2. 클라이언트 응용 프로그램에서 SQL Server에 다시 연결해봅니다.

setspn 명령에 대해 /S 또는 –A 매개 변수를 사용할 수도 있습니다. –A 매개 변수는 더 이상 사용되지 않는 것으로 간주되지만 이전 Windows Server 버전(2012, 2012 R2)에서는 계속 사용할 수 있습니다.

가상 계정(예: 로컬 시스템 또는 NT 서비스\MSSQL Server)을 사용하는 경우 컴퓨터의 호스트 이름에 setspn 명령의 <Account> 값이 나타나야 합니다.

또는 SQL이 필요한 SPN을 자동으로 생성하도록 SQL Service 계정에 적합한 권한을 제공할 수 있습니다.

참고: 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를 사용해서 인증할 수 없습니다.
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>