Så här avgör du om autentiseringstypen är Kerberos
Den här artikeln innehåller en fråga som hjälper dig att fastställa vilken typ av autentisering som används när du ansluter till Microsoft SQL Server. Kontrollera att du kör frågan på en klientdator, inte på den SQL Server som du testar. Annars returneras auth_scheme
frågan som NTLM även om Kerberos är korrekt konfigurerat. Detta inträffar på grund av en säkerhetshärdningsfunktion för SID per tjänst som lades till i Windows 2008. Den här funktionen tvingar alla lokala anslutningar att använda NTLM oavsett om Kerberos är tillgängligt.
SELECT auth_scheme FROM sys.dm_exec_connections WHERE session_id=@@SPID
Använda SQL Server Management Studio
Kör följande fråga i 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
Använda kommandoraden
Kör följande fråga i en kommandotolk:
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)
Alternativ metod
Om något av de föregående alternativen inte är tillgängligt kan du överväga att använda följande alternativa procedur:
Kopiera följande skript till en textredigerare, till exempel Anteckningar, och spara det som 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
Kör getAuthScheme.vbs PowerShell-skriptet i en kommandotolk:
C:\Temp>cscript getAuthScheme.vbs SQLProd01
Du bör se följande utdata:
Microsoft (R) Windows Script Host Version 5.812 Copyright (C) Microsoft Corporation. All rights reserved. Auth scheme: NTLM
Använda PowerShell
Du kan använda PowerShell för att testa SqlClient .NET-providern för att försöka isolera problemet från ditt program:
Kopiera följande skript till en textredigerare, till exempel Anteckningar, och spara det som get-SqlAuthScheme.ps1.
Kör följande skript i en kommandotolk:
#------------------------------- # # 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
Du bör se följande utdata:
C:\temp> .\get-sqlauthscheme sqlprod01
End time: 10/26/2020 18:00:24.753
Elapsed time was 0 ms.
Auth scheme for sqlprod01: NTLM