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。
圖 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)
圖 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 上執行:
圖 SEQ 圖 \* ARABIC 5 DSAC 以 Windows Server 2012 R2 DC 為目標時,非 Windows Server 2012 R2 上會顯示 DSAC 使用者建立錯誤
圖 SEQ 圖 \* ARABIC 6 DSAC 以 Windows Server 2012 R2 DC 為目標時,非 Windows Server 2012 R2 上會顯示 DSAC 使用者修改錯誤
還原將造成重複 UPN 的物件失敗:
當物件由於重複的 UPN / SPN 而無法還原時,不會記錄任何事件。
物件的 UPN 必須是唯一的,才能將其還原。
識別資源回收筒中存在於物件上的 UPN
識別所有具有相同值的物件
移除重複的 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
如果需要還原物件,您必須從其他物件中移除重複的 UPN。 若只有一個物件,只需使用 ADSIEdit 移除重複項目即可。 如果有多個物件具有重複項目,則 Windows PowerShell 可能是更好用的工具。
若要使用 Windows PowerShell 將 UserPrincipalName 屬性變成 null:
注意
userPrincipalName 屬性是單一值屬性,因此這個程序只會移除重複的 UPN。
重複的 SPN
圖 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
圖 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 唯一性。 請遵循這些提示,或完成您自己的提示。
使用 UPN 建立新的使用者
使用 SPN 建立帳戶
使用已定義的 UPN 建立新的使用者,或變更現有帳戶的 UPN。 對另一個帳戶上的 SPN 執行相同的動作
在現有使用者帳戶中填入已在使用中的 UPN
- 使用 PowerShell、ADSIEDIT 或 Active Directory 管理中心 (DSAC.exe)
在現有帳戶中填入已在使用中的 SPN
- 使用 Windows PowerShell、ADSIEDIT 或 SetSPN
觀察錯誤
或者
與課堂講師一起驗證是否可在 Active Directory 管理中心啟用 AD 資源回收筒。 如果可以,請移至下一個步驟。
在使用者帳戶上填入 UPN
刪除帳戶
在不同的帳戶中填入與已刪除帳戶相同的 UPN
嘗試使用資源回收筒 GUI 還原帳戶
假設已為您呈現您在上一個步驟中看到的錯誤。 (沒有您剛才所執行步驟的歷程記錄) 您的目標是完成帳戶的還原。 請參閱活頁簿,例如步驟。