在域帳戶下執行的 SQL Server 無法註冊其 SPN
我正在嘗試配置全新安裝的 SQL Server 以在域帳戶下執行。但是,在嘗試使用另一個域帳戶連接到伺服器時,我會遇到間歇性錯誤,並且
The SQL Server Network Interface library could not register the Service Principal Name
在拖網 ERRORLOG 文件時仍然會看到。我已將我的服務帳戶(不是託管服務帳戶,只是普通使用者帳戶)添加到 AD 組(例如
SQL Servers
),並且我已將 ACE 添加到我的域Computers
容器的 ACL 中,為此組,選擇:
- 適用於:後代電腦對象
- 驗證寫入服務主體名稱:允許
- 讀取 servicePrincipalName: 允許
- 寫 servicePrincipalName: 允許
我已將此復製到所有域控制器,並確認新 ACE 對特定電腦對象的繼承,同時使用 Effective Permissions 選項卡和 with
dsacls CN=SERVER01,CN=Computers,DC=fabrikam,DC=local
,後者現在包括:Allow FABRIKAM\SQL Servers SPECIAL ACCESS for Validated write to service principal name <Inherited from parent> WRITE SELF Allow FABRIKAM\SQL Servers SPECIAL ACCESS for Validated write to service principal name <Inherited from parent> WRITE SELF WRITE PROPERTY READ PROPERTY
但是,當我重新啟動 SQL Server 服務時,我仍然看到該
could not register the Service Principal Name
消息。我也重新啟動了伺服器,結果相同。我使用 Sysinternals Process Explorer 來檢查執行
sqlservr.exe
;那裡的安全選項卡清楚地顯示了正確的服務使用者及其SQL Servers
組成員身份。我知道我可以手動添加 SPN
setspn -A
,但這並不是重點。我還必須做些什麼來確保服務帳戶(以及我放置在
SQL Servers
組中的任何未來帳戶)可以自動註冊自己的 SPN 而無需人工干預?和/或
如何進一步診斷此處缺少哪些特權/權限?
我找到了。
我手動將SPN註冊到服務賬號,然後用ADSIEdit查看了AD,發現手動註冊的SPN並不是存放在Computer
servicePrincipalName
賬號的欄位,而是具體的User賬號的欄位。servicePrincipalName
因此,我沒有授予我的
SQL Servers
組註冊他們自己的 SPN 的權限,而是(無意中)授予他們更改由該電腦上作為本地系統/網路服務帳戶執行的服務註冊的 SPN 的權利。我現在已經從
Computers
容器中刪除了新的 ACE,而是創建了一個新的SQL Servers
組織單位。我已SELF
為此 OU 添加了一個 ACE,並將其限制為適用於後代使用者:
SQL Servers
或 ACL
SELF
- 適用於:後代使用者對象
- 讀取 servicePrincipalName: 允許
- 寫 servicePrincipalName: 允許
現在,當我啟動我的 SQL Server 實例時,我看到了預期的
The SQL Server Network Interface library successfully registered the Service Principal Name
,並且 Kerberos 現在正用於我的遠端連接。(現在要更新我們的內部流程文件,因此需要在新的 OU 下創建新的 SQL Server 服務帳戶,而不是添加到組中)
**編輯:**請注意,域管理員也可以手動將 SPN 註冊到域帳戶,使用
setspn.exe
.setspn -S MSSQLSvc/myhost.redmond.microsoft.com:1433 DOMAIN\User setspn -S MSSQLSvc/myhost.redmond.microsoft.com DOMAIN\User
為 Kerberos 連接 (TechNet) 註冊服務主體名稱。
**編輯 2:**如果
Read servicePrincipalName
和Write servicePrincipalName
屬性在 ACE 列表中不可見,請轉到Attribute Editor
對象屬性對話框的選項卡,點擊Filter
按鈕並確保以下內容:
- 僅顯示具有值的屬性未選中
- 未選中僅顯示可寫屬性
- 顯示屬性*:必*選
- 顯示屬性:可選被選中
- *顯示只讀屬性:*已檢查構造
- *顯示只讀屬性:*選中反向連結
- 顯示只讀屬性:選中 System - only
(其他組合可能有效,但這對我有用)