この記事では、Microsoft SQL Server に接続するときに使用される認証の種類を判断するための詳細な手順について説明します。 テスト対象の SQL Server インスタンスがインストールされているサーバーではなく、クライアント コンピューターで手順を実行してください。 それ以外の場合、Kerberos が正しく構成されている場合でも、出力の auth_scheme 値は常に NTLM になります。 これは、Windows 2008 で追加されたサービスごとの SID セキュリティ強化機能が原因で発生します。 この機能により、Kerberos が使用可能かどうかに関係なく、すべてのローカル接続で NTLM が強制的に使用されます。
SQL Server Management Studio を使用します。
SQL Server Management Studio を開き、SQL Server インスタンスに接続します。
次のクエリを実行します。
SELECT auth_scheme FROM sys.dm_exec_connections WHERE session_id = @@SPID
または、追加の接続の詳細を取得するには、次のクエリを実行します。
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
結果の auth_scheme 列を確認して、認証の種類を確認します。
コマンド ラインを使用する
コマンド プロンプトを開きます。
<ServerName>
をサーバーの名前に置き換えて、次のコマンドを実行します。sqlcmd -S <ServerName> -E -Q "SELECT auth_scheme FROM sys.dm_exec_connections WHERE session_id = @@SPID"
次の出力のような結果は、認証の種類を示します。
auth_scheme ---------------------------------------- NTLM (1 rows affected)
VBScript を使用する
次の VBScript コードをメモ帳などのテキスト エディターにコピーし、 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
コマンド プロンプトから次のコマンドを実行し、
<ServerName>
をサーバーの名前に置き換えます。cscript getAuthScheme.vbs <ServerName>
次の出力のような結果は、認証の種類を示します。
Microsoft (R) Windows Script Host Version 5.812 Copyright (C) Microsoft Corporation. All rights reserved. Auth scheme: NTLM
Windows PowerShell を使用する
Windows PowerShell を使用して SqlClient .NET プロバイダーをテストし、アプリケーションから問題を分離することができます。
次の PowerShell スクリプトをメモ帳などのテキスト エディターにコピーし、 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 lowercase) # .\get-SqlAuthScheme SQLProd01 # Let the driver figure out the DNS suffix, protocol, and port # #------------------------------- # Define a parameter for the server name, defaulting to "localhost" if not provided param ([string]$server = "localhost") # Set the execution policy for the current user to Unrestricted Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope CurrentUser -Force # Build the connection string for the SQL Server connection $connstr = "Server=$($server);Database=master;Integrated Security=SSPI" # Create a new SQL connection object $conn = New-Object System.Data.SqlClient.SqlConnection $conn.ConnectionString = $connstr # Record the start time of the operation $start = Get-Date # Open the SQL connection $conn.Open() # Create a new SQL command object $cmd = $conn.CreateCommand() $cmd.CommandText = "SELECT auth_scheme FROM sys.dm_exec_connections WHERE session_id = @@SPID" # Query to get the authentication scheme # Execute the query and retrieve the result $dr = $cmd.ExecuteReader() $dr.Read() | Out-Null # Read the first row of the result set $auth_scheme = $dr.GetString(0) # Get the authentication scheme from the first column # Close and dispose of the SQL connection $conn.Close() $conn.Dispose() # Record the end time of the operation $end = Get-Date # Calculate the elapsed time $span = $end - $start # Output the results Write-Output "Elapsed time was $($span.TotalMilliseconds) ms." # Display the elapsed time in milliseconds Write-Output "Auth scheme for $($server): $auth_scheme" # Display the authentication scheme for the server
Windows PowerShell を開き、スクリプトが含まれているフォルダーに移動し、次のコマンドを実行します。
.\get-sqlauthscheme <ServerName> # Replace "<ServerName>" with your server name.
次の出力のような結果は、認証の種類を示します。
Elapsed time was 0 ms. Auth scheme for <ServerName>: NTLM