인증 유형이 Kerberos인지 확인하는 방법
이 문서에서는 Microsoft SQL Server에 연결할 때 사용되는 인증 유형을 결정하는 데 도움이 되는 쿼리를 제공합니다. 테스트 중인 SQL Server가 아닌 클라이언트 컴퓨터에서 쿼리를 실행해야 합니다. 그렇지 않으면 Kerberos가 올바르게 구성된 경우에도 쿼리가 NTLM으로 반환 auth_scheme
됩니다. 이는 Windows 2008에서 추가된 서비스별 SID 보안 강화 기능 때문에 발생합니다. 이 기능은 Kerberos를 사용할 수 있는지 여부에 관계없이 모든 로컬 연결에서 NTLM을 사용하도록 강제합니다.
SELECT auth_scheme FROM sys.dm_exec_connections WHERE session_id=@@SPID
SQL Server Management Studio 사용
SQL Server Management Studio에서 다음 쿼리 실행:
SELECT c.session_id, c.net_transport, c.encrypt_option,
c.auth_scheme, s.host_name, @@SERVERNAME as "remote_name",
s.program_name, s.client_interface_name, s.login_name,
s.nt_domain, s.nt_user_name, s.original_login_name,
c.connect_time, s.login_time
FROM sys.dm_exec_connections AS c
JOIN sys.dm_exec_sessions AS s ON c.session_id = s.session_id
WHERE c.session_id=@@SPID
명령줄 사용
명령 프롬프트에서 다음 쿼리를 실행합니다.
C:\Temp>sqlcmd -S SQLProd01 -E -Q "select auth_scheme from sys.dm_exec_connections where session_id=@@SPID"
auth_scheme
----------------------------------------
NTLM
(1 rows affected)
대체 방법
이전 옵션 중 하나를 사용할 수 없는 경우 다음 대체 절차를 사용하는 것이 좋습니다.
다음 스크립트를 메모장과 같은 텍스트 편집기에 복사하고 getAuthScheme.vbs로 저장합니다.
' Auth scheme VB script. ' Run on a client machine, not the server. ' If you run locally, you will always get NTLM even if Kerberos is properly enabled. ' ' USAGE: CSCRIPT getAuthScheme.vbs tcp:SQLProd01.contoso.com,1433 ' explicitly specify DNS suffix, protocol, and port # ('tcp' must be lower case) ' USAGE: CSCRIPT getAuthScheme.vbs SQLProd01 ' let the driver figure out the DNS suffix, protocol, and port # ' Dim cn, rs, s s = WScript.Arguments.Item(0) ' get the server name from the command-line Set cn = createobject("adodb.connection") ' ' Various connection strings depending on the driver/Provider installed on your machine ' SQLOLEDB is selected as it is on all windows machines, but may have limitations, such as lack of TLS 1.2 support ' Choose a newer provider or driver if you have it installed. ' cn.open "Provider=SQLOLEDB;Data Source=" & s & ";Initial Catalog=master;Integrated Security=SSPI" ' On all Windows machines 'cn.open "Provider=SQLNCLI11;Data Source=" & s & ";Initial Catalog=master;Integrated Security=SSPI" ' Newer 'cn.open "Provider=MSOLEDBSQL;Data Source=" & s & ";Initial Catalog=master;Integrated Security=SSPI" ' Latest, good for SQL 2012 and newer 'cn.open "Driver={ODBC Driver 17 for SQL Server};Server=" & s & ";Database=master;Trusted_Connection=Yes" ' Latest ' ' Run the query and display the results ' set rs = cn.Execute("select auth_scheme from sys.dm_exec_connections where session_id=@@SPID") WScript.Echo "Auth scheme: " & rs(0) rs.close cn.close
명령 프롬프트에서 getAuthScheme.vbs PowerShell 스크립트를 실행합니다.
C:\Temp>cscript getAuthScheme.vbs SQLProd01
다음과 같은 출력이 표시됩니다.
Microsoft (R) Windows Script Host Version 5.812 Copyright (C) Microsoft Corporation. All rights reserved. Auth scheme: NTLM
PowerShell 사용
PowerShell을 사용하여 SqlClient .NET 공급자를 테스트하여 애플리케이션에서 문제를 격리할 수 있습니다.
다음 스크립트를 메모장과 같은 텍스트 편집기에 복사하고 get-SqlAuthScheme.ps1로 저장합니다.
명령 프롬프트에서 다음 스크립트를 실행합니다.
#------------------------------- # # get-SqlAuthScheme.ps1 # # PowerShell script to test a System.Data.SqlClient database connection # # USAGE: .\get-SqlAuthScheme tcp:SQLProd01.contoso.com,1433 ' explicitly specify DNS suffix, protocol, and port # ('tcp' must be lower case) # USAGE: .\get-SqlAuthScheme SQLProd01 ' let the driver figure out the DNS suffix, protocol, and port # # #------------------------------- param ([string]$server = "localhost") Set-ExecutionPolicy Unrestricted-Scope CurrentUser $connstr = "Server=$server;Database=master;Integrated Security=SSPI" [System.Data.SqlClient.SqlConnection] $conn = New-Object System.Data.SqlClient.SqlConnection $conn.ConnectionString = $connstr [System.DateTime] $start = Get-Date $conn.Open() [System.Data.SqlClient.SqlCommand] $cmd = New-Object System.Data.SqlClient.SqlCommand $cmd.CommandText = "select auth_scheme from sys.dm_exec_connections where session_id=@@spid" $cmd.Connection = $conn $dr = $cmd.ExecuteReader() $result = $dr.Read() $auth_scheme = $dr.GetString(0) $conn.Close() $conn.Dispose() [System.DateTime] $end = Get-Date [System.Timespan] $span = ($end - $start) "End time: " + $end.ToString("M/d/yyyy HH:mm:ss.fff") "Elapsed time was " + $span.Milliseconds + " ms." "Auth scheme for " + $server + ": " + $auth_scheme
다음과 같은 출력이 표시됩니다.
C:\temp> .\get-sqlauthscheme sqlprod01
End time: 10/26/2020 18:00:24.753
Elapsed time was 0 ms.
Auth scheme for sqlprod01: NTLM