註冊服務主要名稱

服務主要名稱 (SPN) 是用戶端用以唯一識別服務執行個體的名稱。Kerberos 驗證服務可以使用 SPN 來驗證服務。當用戶端想要連接到服務時,它會尋找服務的執行個體、撰寫該執行個體的 SPN、連接到服務,然後呈現服務的 SPN 以進行驗證。

[!附註]

本主題提供的資訊也適用於使用群集的 SQL Server 組態。

Windows 驗證是使用者驗證 SQL Server 的慣用方法。使用 Windows 驗證的用戶端是使用 NTLM 或 Kerberos 所驗證。在 Active Directory 環境中,一定會先嘗試 Kerberos 驗證。Kerberos 驗證無法供使用具名管道的 SQL Server 2000 和 SQL Server 2005 用戶端使用。

權限

當 Database Engine 服務啟動時,它會嘗試註冊服務主要名稱 (SPN)。如果啟動 SQL Server 的帳戶沒有在 Active Directory 網域服務中註冊 SPN 的權限,此呼叫將會失敗,而且警告訊息會記錄在應用程式事件記錄檔以及 SQL Server 錯誤記錄檔中。若要註冊 SPN,Database Engine 必須在內建帳戶下執行,例如 Local System (不建議使用) 或 NETWORK SERVICE,或是在具有註冊 SPN 之權限的帳戶下執行 (例如網域管理員帳戶)。如果 SQL Server 並未在這些帳戶的其中一個之下執行,SPN 就不會在啟動時註冊,而且網域管理員必須手動註冊 SPN。

KB 文件如何在 SQL Server 中使用 Kerberos 驗證 (機器翻譯) 包含了有關如何將讀取或寫入權限授與非網域管理員帳戶之 SPN 的資訊。

如何使用 SQL Server 2008 實作 Kerberos 限制的委派中有提供其他資訊。

SPN 格式

從 SQL Server 2008 開始,SPN 格式就有了變動,以便能夠在 TCP/IP、具名管道和共用記憶體上支援 Kerberos 驗證。具名和預設執行個體支援的 SPN 格式如下所示。

具名執行個體

  • MSSQLSvc/FQDN:[port**|**instancename],其中:

    • MSSQLSvc 是所註冊的服務。

    • FQDN 是伺服器的完整網域名稱。

    • port 是 TCP 通訊埠編號。

    • instancename 是 SQL Server 執行個體的名稱。

預設執行個體

  • MSSQLSvc/FQDN:port**|**MSSQLSvc/FQDN,其中:

    • MSSQLSvc 是所註冊的服務。

    • FQDN 是伺服器的完整網域名稱。

    • port 是 TCP 通訊埠編號。

新的 SPN 格式不需要通訊埠編號。這表示,不使用通訊埠編號的多重通訊埠伺服器或通訊協定可以使用 Kerberos。

[!附註]

在 TCP/IP 連接的情況下,由於 TCP 通訊埠包含於 SPN 中,因此 SQL Server 必須啟用 TCP 通訊協定,使用者才能使用 Kerberos 驗證進行連接。

自動 SPN 註冊

當 SQL Server Database Engine 執行個體啟動時,SQL Server 會嘗試註冊 SQL Server 服務的 SPN。當此執行個體停止時,SQL Server 會嘗試取消註冊 SPN。如果是 TCP/IP 連接,SPN 會以 MSSQLSvc/<FQDN>:<tcpport> 格式註冊。具名執行個體和預設執行個體都會註冊為 MSSQLSvc (根據 <tcpport> 值來區分執行個體)。

如果是支援 Kerberos 的其他連接,SPN 會針對具名執行個體來以 MSSQLSvc/<FQDN>:<instancename> 格式註冊。用來註冊預設執行個體的格式為 MSSQLSvc/<FQDN>

如果服務帳戶缺少這些動作所需的權限,可能需要手動介入才能註冊或取消註冊 SPN。

手動 SPN 註冊

若要手動註冊 SPN,管理員必須使用 Microsoft Windows Server 2003 支援工具所隨附的 Setspn.exe 工具。這些工具是包含在 Windows Server 2003 Service Pack 1 (SP1) 中。如需詳細資訊,請參閱<Windows Server 2003 Service Pack 1 支援工具>KB 文件。

Setspn.exe 是一個命令列工具,可讓您讀取、修改及刪除服務主要名稱 (SPN) 目錄屬性。此工具也可讓您檢視目前的 SPN、重設此帳戶的預設 SPN,或是加入或刪除補充 SPN。

下列範例說明用來手動註冊 TCP/IP 連接之 SPN 的語法。

setspn -A MSSQLSvc/myhost.redmond.microsoft.com:1433 accountname

注意   如果 SPN 已存在,必須先將它刪除以後才可以重新註冊。您可以搭配 -D 參數使用 setspn 命令來進行這項處理。下列範例說明如何手動註冊以新執行個體為基礎的 SPN。若為預設執行個體,請使用:

setspn –A MSSQLSvc/myhost.redmond.microsoft.com accountname

若為具名執行個體,請使用:

setspn –A MSSQLSvc/myhost.redmond.microsoft.com:instancename accountname

用戶端連接

用戶端驅動程式內可支援使用者指定的 SPN。但是,如果未提供 SPN,將會根據用戶端連接的類型來自動產生 SPN。如果是 TCP 連接,將會針對具名和預設執行個體使用 MSSQLSvc/FQDN:[port] 格式的 SPN。

如果是具名管道和共用記憶體的連接,將會針對具名執行個體使用 MSSQLSvc/FQDN:instancename 格式的 SPN,並針對預設執行個體使用 MSSQLSvc/FQDN 格式的 SPN。

將服務帳戶當做 SPN 使用

服務帳戶可以當做 SPN 使用,它們是透過 Kerberos 驗證的連接屬性所指定,而且會使用以下的格式:

  • 適用於網域使用者帳戶的 username@domaindomain\username

  • 適用於電腦網域帳戶 (如 Local System 或 NETWORK SERVICES) 的 machine$@domainhost\FQDN

若要判斷連接的驗證方法,請執行下列查詢。

SELECT net_transport, auth_scheme 
FROM sys.dm_exec_connections 
WHERE session_id = @@SPID;

驗證預設值

下表說明根據 SPN 註冊狀況所使用的驗證預設值。

狀況

驗證方法

SPN 會對應到正確的網域或內建帳戶。例如,本機系統或 NETWORK SERVICE。

附註附註
正確表示已註冊之 SPN 對應的帳戶就是執行 SQL Server 服務所使用的帳戶。

本機連接會使用 NTLM,遠端連接則使用 Kerberos。

SPN 為正確的網域或內建帳戶。

附註附註
正確表示已註冊之 SPN 對應的帳戶就是執行 SQL Server 服務所使用的帳戶。

本機連接會使用 NTLM,遠端連接則使用 Kerberos。

SPN 對應到不正確的網域或內建帳戶。

驗證失敗。

SPN 查閱失敗,或是未對應到正確的網域或內建帳戶,或者它不是正確的網域或內建帳戶。

本機和遠端連接都會使用 NTLM。

註解

專用管理員連接 (DAC) 會在 SQL Server 2008 中使用以 SPN 為根據的執行個體名稱。如果該 SPN 註冊成功的話,Kerberos 驗證便可搭配 DAC 使用。另外,使用者也可將此帳戶名稱指定為 SPN。

如果 SPN 註冊在啟動期間失敗,則此失敗會記錄在 SQL Server 錯誤記錄檔中,而啟動會繼續進行。

如果 SPN 取消註冊在關閉期間失敗,則此失敗會記錄在 SQL Server 錯誤記錄檔中,而關閉作業會繼續進行。