Active-Directory

在域帳戶下執行的 SQL Server 無法註冊其 SPN

  • January 19, 2017

我正在嘗試配置全新安裝的 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並不是存放在ComputerservicePrincipalName賬號的欄位,而是具體的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 servicePrincipalNameWrite servicePrincipalName屬性在 ACE 列表中不可見,請轉到Attribute Editor對象屬性對話框的選項卡,點擊Filter按鈕並確保以下內容:

  • 僅顯示具有值的屬性選中
  • 選中僅顯示可寫屬性
  • 顯示屬性*:必*
  • 顯示屬性:可選選中
  • *顯示只讀屬性:*已檢查構造
  • *顯示只讀屬性:*選中反向連結
  • 顯示只讀屬性:選中 System - only

(其他組合可能有效,但這對我有用)

引用自:https://serverfault.com/questions/573160