共用方式為


SPN 和 UPN 的唯一性

作者:Windows 群組資深支援呈核工程師 Justin Turner

注意

本內容由 Microsoft 客戶支援工程師編寫,適用對象為經驗豐富的系統管理員和系統架構​​師,如果 TechNet 提供的主題已無法滿足您,您要找的是 Windows Server 2012 R2 中功能和解決方案的更深入技術講解,則您是本文的適用對象。 不過,本文未經過相同的編輯階段,因此部分語句也許不如 TechNet 文章那樣洗鍊。

概觀

執行 Windows Server 2012 R2 的網域控制站會阻止建立重複的服務主體名稱 (SPN) 與使用者主體名稱 (UPN)。 這包括,如果還原或重新引發刪除的物件或重新命名物件會導致重複。

背景

重複的服務主體名稱 (SPN) 經常會發生,並導致驗證失敗,且可能造成過多的 LSASS CPU 使用率。 沒有現成方法可阻止新增重複的 SPN 或 UPN。 *

重複的 UPN 值會中斷內部部署 AD 與 Office 365 之間的同步處理。

*Setspn.exe 通常用來建立新的 SPN,而且在功能上內建至隨 Windows Server 2008 一起發行的版本,其會新增是否有重複的檢查。

資料表 SEQ 資料表 \* ARABIC 1:UPN 和 SPN 唯一性

功能 註解
UPN 唯一性 重複的 UPN 會中斷內部部署 AD 帳戶與基於 Microsoft Entra ID 之服務 (如 Office 365) 的同步處理。
SPN 唯一性 Kerberos 需要 SPN 進行相互驗證。 重複的 SPN 會導致驗證失敗。

如需 UPN 和 SPN 唯一性需求的詳細資訊,請參閱唯一性條件約束

徵兆

錯誤碼 8467 或 8468 或其十六進位、符號或字串對等項目會記錄在各種螢幕上的對話中,以及記錄在目錄服務事件記錄檔的事件識別碼 2974 中。 只有在下列情況下,才會阻止建立重複 UPN 或 SPN 的嘗試:

  • 寫入是由 Windows Server 2012 R2 DC 處理

資料表 SEQ 資料表 \* ARABIC 2:UPN 和 SPN 唯一性錯誤碼

Decimal Hex 符號 String
8647 21C7 ERROR_DS_SPN_VALUE_NOT_UNIQUE_IN_FOREST 作業失敗,因為提供用於新增/修改的 SPN 值不是全樹系唯一的。
8648 21C8 ERROR_DS_UPN_VALUE_NOT_UNIQUE_IN_FOREST 作業失敗,因為提供用於新增/修改的 UPN 值不是全樹系唯一的。

如果 UPN 不是唯一的,建立新的使用者就會失敗

DSA.msc

您所選擇的使用者登入名稱已在此企業中使用。 選擇另一個登入名稱,然後再試一次。

此螢幕擷取畫面顯示訊息:您所選的登入名稱已有人使用。

修改現有的帳戶:

指定的使用者登入名稱已存在於企業中。 藉由變更前置詞或從清單中選取不同的尾碼,指定新的前置詞。

此螢幕擷取畫面顯示訊息:您所使用的登入名稱已存在於企業中。

Active Directory 管理中心功能 (DSAC.exe)

嘗試在 Active Directory 管理中心使用已存在的 UPN 建立新的使用者,會傳回下列錯誤。

此螢幕擷取畫面顯示訊息:未建立新使用者。

圖 SEQ 圖 \* ARABIC 1 由於重複的 UPN 而無法建立新的使用者時,AD 管理中心會顯示錯誤

事件 2974 來源:ActiveDirectory_DomainService

此螢幕擷取畫面顯示

圖 SEQ 圖 \* ARABIC 2 事件識別碼 2974 與錯誤 8648

事件 2974 會列出已封鎖的值,以及提供一份清單,列出已包含該值的一或多個物件 (最多 10 個)。 在下圖中,您可以看到 UPN 屬性值 dhunt@blue.contoso.com 已存在於其他四個物件上。 由於這是 Windows Server 2012 R2 中的新功能,因此當下層 DC 處理寫入嘗試時,仍會在混合環境中意外建立重複的 UPN 和 SPN。

此螢幕擷取畫面顯示 ARABIC 2 事件識別碼 2974 與錯誤 8648。

圖 SEQ 圖 \* ARABIC 3 事件 2974 顯示所有包含重複 UPN 的物件

提示

定期檢閱事件識別碼 2974:

  • 識別建立重複 UPN 或 SPN 的嘗試
  • 識別已包含重複項目的物件

8648 = 「作業失敗,因為提供用於新增/修改的 UPN 值不是全樹系唯一的。」

SetSPN:

自 Windows Server 2008 發行以來,當使用 "-S" 選項時,Setspn.exe 已內建重複 SPN 偵測功能。 不過,您可以使用 "-A" 選項略過重複 SPN 偵測。 使用 SetSPN 搭配 -A 選項,以 Windows Server 2012 R2 DC 為目標時,會阻止建立重複的 SPN。 顯示的錯誤訊息與使用 -S 選項時所顯示的錯誤訊息相同:「找到重複的 SPN,中止作業!」

ADSIEDIT:

Operation failed. Error code: 0x21c8
The operation failed because UPN value provided for addition/modification is not unique forest-wide.
000021C8: AtrErr: DSID-03200BBA, #1: 0: 000021C8: DSID-03200BBA, problem 1005 (CONSTRAINT_ATT_TYPE), data 0, Att 90290 (userPrincipalName)

此螢幕擷取畫面顯示作業失敗,錯誤碼為 0x21c8。

圖 SEQ 圖 \* ARABIC 4 當新增重複 UPN 受阻時,ADSIEdit 中會顯示錯誤訊息

Windows PowerShell

Windows Server 2012 R2:

此螢幕擷取畫面顯示訊息:作業失敗。

以 Windows Server 2012 R2 DC 為目標時,PowerShell 從 Server 2012 執行:

此螢幕擷取畫面顯示未知錯誤。

以 Windows Server 2012 R2 DC 為目標時,DSAC.exe 在 Windows Server 2012 上執行:

此螢幕擷取畫面顯示以 Windows Server 2012 R2 DC 為目標時,非 Windows Server 2012 R2 上出現使用者建立錯誤。

圖 SEQ 圖 \* ARABIC 5 DSAC 以 Windows Server 2012 R2 DC 為目標時,非 Windows Server 2012 R2 上會顯示 DSAC 使用者建立錯誤

此螢幕擷取畫面顯示以 Windows Server 2012 R2 DC 為目標時,非 Windows Server 2012 R2 上出現使用者修改錯誤。

圖 SEQ 圖 \* ARABIC 6 DSAC 以 Windows Server 2012 R2 DC 為目標時,非 Windows Server 2012 R2 上會顯示 DSAC 使用者修改錯誤

還原將造成重複 UPN 的物件失敗:

此螢幕擷取畫面顯示如何還原物件。

此螢幕擷取畫面顯示作業失敗,因為提供用於新增/修改的 UPN 值不是全樹系唯一的。

當物件由於重複的 UPN / SPN 而無法還原時,不會記錄任何事件。

物件的 UPN 必須是唯一的,才能將其還原。

  1. 識別資源回收筒中存在於物件上的 UPN

  2. 識別所有具有相同值的物件

  3. 移除重複的 UPN

使用 repadmin.exe 識別已刪除物件上衝突的 UPN

Repadmin /showattr DCName "DN of deleted objects container" /subtree /filter:"(msDS-LastKnownRDN=<NAME>)" /deleted /atts:userprincipalname
repadmin /showattr DCName "CN=Deleted Objects,DC=blue,DC=contoso,DC=com" /subtree /filter:"(msDS-LastKnownRDN=Dianne Hunt2)" /deleted /atts:userprincipalname

C:\>repadmin /showattr winbluedc1 "cn=deleted objects,dc=blue,dc=contoso,dc=com" /subtree /filter:"(msds-lastknownrdn=Dianne Hunt2)" /deleted /atts:userprincipalname
DN: CN=Dianne Hunt2\0ADEL:dd3ab8a4-3005-4f2f-814f-d6fc54a1a1c0,CN=Deleted Object
s,DC=blue,DC=contoso,DC=com
    1> userPrincipalName: dhunt@blue.contoso.com

若要識別所有具有相同 UPN 的物件:使用 Repadmin.exe

repadmin /showattr WinBlueDC1 "DC=blue,DC=contoso,DC=com" /subtree /filter:"(userPrincipalName=dhunt@blue.contoso.com)" /deleted /atts:DN

C:\>repadmin /showattr winbluedc1 "dc=blue,dc=contoso,dc=com" /subtree /filter:"(userPrincipalName=dhunt@blue.contoso.com)" /deleted /atts:DN
DN: CN=Administrator,CN=Users,DC=blue,DC=contoso,DC=com
DN: CN=xouser1,CN=Users,DC=blue,DC=contoso,DC=com
DN: CN=xouser10,CN=Users,DC=blue,DC=contoso,DC=com
DN: CN=xouser100,CN=Users,DC=blue,DC=contoso,DC=com
DN: CN=Dianne Hunt,OU=Marketing,DC=blue,DC=contoso,DC=com
DN: CN=Dianne Hunt2\0ADEL:dd3ab8a4-3005-4f2f-814f-d6fc54a1a1c0,CN=Deleted Objects,DC=blue,DC=contoso,DC=com

提示

repadmin.exe 中先前未記載的 /deleted 參數是用來在結果集中包含已刪除的物件

  • 開啟 Active Directory 管理中心並瀏覽至 [全域搜尋]

  • 選取 [轉換為 LDAP] 選項按鈕

  • 輸入 (userPrincipalName=ConflictingUPN)

    • ConflictingUPN 取代為處於衝突的實際 UPN
  • 選取 [套用]

此螢幕擷取畫面顯示全域搜尋頁面。

使用 Windows PowerShell

Get-ADObject -LdapFilter "(userPrincipalName=dhunt@blue.contoso.com)" -IncludeDeletedObjects -SearchBase "DC=blue,DC=Contoso,DC=com" -SearchScope Subtree -Server winbluedc1.blue.contoso.com

SPN 和 UPN 的唯一性

如果需要還原物件,您必須從其他物件中移除重複的 UPN。 若只有一個物件,只需使用 ADSIEdit 移除重複項目即可。 如果有多個物件具有重複項目,則 Windows PowerShell 可能是更好用的工具。

若要使用 Windows PowerShell 將 UserPrincipalName 屬性變成 null:

此螢幕擷取畫面顯示作業失敗,錯誤碼為 0x21c7。

注意

userPrincipalName 屬性是單一值屬性,因此這個程序只會移除重複的 UPN。

重複的 SPN

此螢幕擷取畫面顯示當新增重複 SPN 受阻時 ADSIEdit 中顯示的錯誤訊息。

圖 SEQ 圖 \* ARABIC 8 當新增重複 SPN 受阻時,ADSIEdit 中會顯示錯誤訊息

目錄服務事件記錄檔中記錄的是 ActiveDirectory_DomainService 事件識別碼 2974

Operation failed. Error code: 0x21c7
The operation failed
The attribute value provided is not unique in the forest or partition. Attribute:
servicePrincipalName Value=<SPN>
<Object DN> Winerror: 8467

此螢幕擷取畫面顯示建立重複 SPN 受阻時所記錄的錯誤。

圖 SEQ 圖 \* ARABIC 9 建立重複 SPN 受阻時會記錄錯誤

工作流程

  • 如果 DC == GC

    • 不需要 Offbox 呼叫,即可在本機滿足查詢

    • UPN 案例

      • 針對提供的 UPN 查詢本機全樹系 UPN 索引 (userPrincipalName;全域索引)

        • 如果項目傳回了 == 0 -> 寫入繼續

        • 如果項目傳回了 !=0 -> 寫入失敗

          • 已記錄事件

          • 也會傳回擴充錯誤:

            • 8648:

              ERROR_DS_UPN_VALUE_NOT_UNIQUE_IN_FOREST

    • SPN 案例

      • 針對提供的 SPN 查詢本機全樹系 SPN 索引 (servicePrincipalName;全域索引)

        • 如果項目傳回了 == 0 -> 寫入繼續

        • 如果項目傳回了 !=0 -> 寫入失敗

          • 已記錄事件

          • 也會傳回擴充錯誤:

            • 8647:

              ERROR_DS_SPN_VALUE_NOT_UNIQUE_IN_FOREST

  • 如果 DC != GC

    • Offbox 呼叫是理想的,但並非關鍵性的,也就是說,這是盡力而為的唯一性檢查

      • 只有在找不到 GC 時,檢查才會繼續針對本機 DIT 進行

      • 已記錄事件來指出這類情況

    • UPN 案例

      • 是否要針對最接近的 GC 提交 LDAP 查詢? 針對提供的 UPN 查詢 GC 的全樹系 UPN 索引 (userPrincipalName;全域索引)

        • 如果項目傳回了 == 0 -> 寫入繼續

        • 如果項目傳回了 !=0 -> 寫入失敗

          • 已記錄事件

          • 也會傳回擴充錯誤:

            • 8648:

              ERROR_DS_UPN_VALUE_NOT_UNIQUE_IN_FOREST

    • SPN 案例

      • 是否要針對最接近的 GC 提交 LDAP 查詢? 針對提供的 SPN 查詢 GC 的全樹系 SPN 索引 (servicePrincipalName;全域索引)

        • 如果項目傳回了 == 0 -> 寫入繼續

        • 如果項目傳回了 !=0 -> 寫入失敗

          • 已記錄事件

          • 也會傳回擴充錯誤:

            • 8647:

              ERROR_DS_SPN_VALUE_NOT_UNIQUE_IN_FOREST

重新引發已刪除的物件時,會檢查存在的 SPN 或 UPN 值是否具有唯一性。 如果找到重複項目,要求就會失敗。

  • 對於 DNS 主機名稱、SAM 帳戶名稱等特定屬性變更,在進行修改時,SPN 會據以更新。 在此流程中,會刪除過時的 SPN,然後建構新的 SPN 並新增至資料庫。 觸發此路徑的必要屬性修改如下:

    • ATT_DNS_HOST_NAME

    • ATT_MS_DS_ADDITIONAL_DNS_HOST_NAME

    • ATT_SAM_ACCOUNT_NAME

    • ATT_MS_DS_ADDITIONAL_SAM_ACCOUNT_NAME

    • ATT_SERVER_REFERENCE_BL

    • ATT_USER_ACCOUNT_CONTROL

如果有任何新的 SPN 值重複,修改就會失敗。 在上述清單中,重要屬性是 ATT_DNS_HOST_NAME (機器名稱) 和 ATT_SAM_ACCOUNT_NAME (SAM 帳戶名稱)。

試試這個:探索 SPN 和 UPN 唯一性

這是課程模組中數個「試試這個」活動中的第一個。 本課程模組沒有個別的實驗室指南。 「試試這個」是自由形式的活動,可讓您在實驗室環境中探索課程教材。 您可以選擇遵循提示或離開劇本,並提出您自己的活動。

注意

  • 這是數個「試試這個」活動中的第一個。
  • 本課程模組沒有個別的實驗室指南。
  • 「試試這個」是基本的自由形式活動,可讓您在實驗室環境中探索課程教材。
  • 您可以選擇遵循提示或離開劇本,並提出您自己的活動。
  • 雖然並非所有區段都有「試試這個」提示,但仍鼓勵您在適當的情況下於實驗室中探索課程內容。

實驗 SPN 和 UPN 唯一性。 請遵循這些提示,或完成您自己的提示。

  1. 使用 UPN 建立新的使用者

  2. 使用 SPN 建立帳戶

  3. 使用已定義的 UPN 建立新的使用者,或變更現有帳戶的 UPN。 對另一個帳戶上的 SPN 執行相同的動作

    1. 在現有使用者帳戶中填入已在使用中的 UPN

      1. 使用 PowerShell、ADSIEDIT 或 Active Directory 管理中心 (DSAC.exe)
    2. 在現有帳戶中填入已在使用中的 SPN

      1. 使用 Windows PowerShell、ADSIEDIT 或 SetSPN
  4. 觀察錯誤

或者

  1. 與課堂講師一起驗證是否可在 Active Directory 管理中心啟用 AD 資源回收筒。 如果可以,請移至下一個步驟。

  2. 在使用者帳戶上填入 UPN

  3. 刪除帳戶

  4. 在不同的帳戶中填入與已刪除帳戶相同的 UPN

  5. 嘗試使用資源回收筒 GUI 還原帳戶

  6. 假設已為您呈現您在上一個步驟中看到的錯誤。 (沒有您剛才所執行步驟的歷程記錄) 您的目標是完成帳戶的還原。 請參閱活頁簿,例如步驟。