本文可協助您在將過時的域控制器 (DC) 或全域編錄伺服器帶回在線之後,手動移除 揮之不去的物件 。 在許多情況下,您可以使用 Lingering Object Liquidator 之類的命令或工具來清除揮之不去的物件repadmin /removelingeringobjects
。 不過,如果您已經 放棄對象,這些設施將無法運作。
原始 KB 編號: 314282
當您長時間離線域控制器或全域編錄伺服器重新上線時,可能會發生下列任何問題:
- 電子郵件訊息不會傳遞至用戶物件在網域之間移動的使用者。 將過期的域控制器或全域編錄伺服器帶回在線之後,用戶物件的兩個實例都會出現在全域編錄內容中。 這兩個物件都有相同的電子郵件位址,因此無法傳遞電子郵件訊息。
- 已不存在的用戶帳戶仍會出現在全域通訊清單中。
- 已不存在的通用群組仍會出現在使用者的存取令牌中。
離線持續時間超過墓碑存留期設定的值
已離線超過墓碑存留期設定值(預設值為60或180天)的域控制器或全域編錄伺服器,可能包含在其他域控制器或全域編錄伺服器上已刪除的物件。 此外,這些物件的墓碑可能已不存在。 當您將過期的域控制器帶回在線時,就無法收到對象刪除的通知。 如果修改任何物件,則會在網域的其餘部分重新啟用它們。
為了揮之不去復寫至讀取/寫入命名內容的對象,標準行為(鬆散複寫一致性)是接收域控制器會重新建立尚未存在於本機資料庫目錄資訊樹狀結構中的物件(DIT)。 然後,這些物件會復寫回原始域控制器,有效地重新建立已刪除的物件。 如果物件不應該存在於 Active Directory 中(例如,如果物件是由過時的域控制器重新引進),您可以使用標準工具刪除物件(例如 ADSIEdit 或 Active Directory 使用者和電腦 嵌入式管理單元)。
直接移除讀取/寫入命名內容的揮之不去的物件。 本文說明如何移除已出現在全域編錄(只讀)命名內容中的揮之不去的物件。
取得辨別名稱並識別網域
識別物件所在網域的最佳方式,就是建立對象的辨別名稱。因此,具有物件讀取/寫入複本的域控制器名稱。 您可以使用Ldp.exe工具來搜尋重複使用者、群組或通訊組清單的名稱(或名稱的一部分)來執行此動作:
開始 Ldp.exe。
在 [ 連線] 功能表上,選取 [ 連線]。
輸入全域編錄伺服器的名稱。 輸入 3268 作為要連線的埠。 選取 [確定]。
在 [ 連線] 功能表上,選取 [ 系結]。 如果您目前的認證不足以查詢所有全域編錄內容,請輸入有效的認證。 選取 [確定]。
在 [ 檢視] 功能表上,選取 [ 樹狀結構]。 輸入樹系根目錄的辨別名稱。 選取 [確定]。
以滑鼠右鍵按兩下樹狀目錄中的樹系根目錄,然後選取 [ 搜尋]。
建立下列表單的篩選:
(attribute=value)
將屬性和值取代為適當的數據。 例如,若要建立篩選以傳回結果,其中 sAMAccountName 屬性的值設定為名為 testuser 的使用者帳戶,請在 [篩選] 方塊中輸入 (sAMAccountName=testuser)。 cn、userPrincipalName、sAMAccountName、name、mail 和 sn 屬性是尋找使用者對象的實用候選專案。 針對群組物件,請使用 cn、 sAMAccountName 或 name 屬性。 如有必要,您可以在值欄位中使用星號 。
如需輕量型目錄存取通訊協定 (LDAP) 篩選語法的詳細資訊,請參閱 搜尋篩選語法。
選取 [子樹 ] 作為搜尋範圍。
選取選項。 在 [搜尋選項] 對話框中,移至 [屬性] 控件的結尾。
將 objectGUID 附加至清單。 選取 [確定]。
選取 [執行] 執行查詢。
檢視結果。 您必須識別應該從全域編錄伺服器中移除哪些顯示的物件。 您發現有問題的物件之一是物件不存在於命名內容的讀取/寫入複本上。
視需要重新執行查詢並重新執行。
如果您識別出揮之不去的物件,請記下其辨別名稱和 objectGUID。
取得對象的辨別名稱之後,查看 辨別名稱的 dc= 部分,以識別其所在網域。 例如,cn=FirstName LastName,cn=Users,dc=contoso,dc=com 的網域 contoso.com。 接下來,找出網域的域控制器(也可以是全域編錄伺服器)。
repadmin /showreps <dcname>
執行 命令 (其中 <dcname>
是您找到的域控制器名稱)。 從輸出中,記下域控制器的 objectGuid
:
C:\>repadmin /showreps some-DC
Your-Site\some-DC
DSA Options : (none)
objectGuid : <GUID>
如果您只有少數物件和全域編錄伺服器,請刪除揮之不去的物件
如果您只有少數物件和全域編錄伺服器,請遵循下列步驟,使用 Ldp.exe 刪除物件:
使用企業系統管理員認證登入每個包含揮之物件複本的全域編錄伺服器。
啟動 Ldp.exe 並連線到本機域控制器上的埠 389(讓 [ 伺服器 ] 方塊保持空白)。
在 [ 連線] 功能表上,選取 [ 系結]。 將所有方塊保留空白(您已以企業系統管理員身分登入)。
在 [ 瀏覽] 功能表上,選取 [ 修改]。
將 Dn 方塊保留空白。
在 [ 屬性 ] 方塊中,輸入 RemoveLingeringObject。
輸入 <GUID= 作為值。
附加您稍早從 命令
repadmin /showreps <dcname>
取得之域控制器的 GUID。注意
在此範例中,
<dcname>
是裝載揮之物件之可寫入命名內容的域控制器。Append > : <GUID=。 不要省略空格。
附加揮之物件的 GUID。
附加 >。
完整值看起來應該像: <GUID=GUID> : <GUID=GUID>
選取 [取代] 作業,然後選取介面上的 Enter。 現在命令會出現在 專案清單中。
選取 [ 執行] 以執行要求。 Ldp.exe視窗的右側包含要求結果。 看起來應該如下列範例所示:
***Call Modify... ldap_modify_s(ld, '(null)',[1] attrs); Modified "".
如果您有許多物件和全域編錄伺服器,請刪除揮之不去的物件
如果您有許多物件要刪除,而且有許多全域編錄伺服器,則使用下列腳本可能更方便:
將下列文字貼到新資料夾中名為 Walkservers.cmd 的新檔案中:
for /f %%j in (server-list.txt) do walkobjects %%j
將下列文字貼到名為 Walkobjects.cmd 的檔案中:
for /f "delims=@" %%i in (object-list.txt) do cscript //NoLogo MODIFYROOTDSE.VBS %1 "%%i" >>update-%1.log
注意
這是單一命令行。 換行符會插入此處以取得可讀性。
將下列文字貼到名為 Modifyrootdse.vbs 的檔案中:
'******************************************************************** '* '* File: MODIFYROOTDSE.VBS '* Created: January 2002 '* Version: 1.0 '* '* Main Function: Writes Active Directory information to clean up '* objects as per: Q314282. '* Usage: Modifyrootdse.vbs <TargetServer> <GUID PAIR> '* Parameter are fed into the script using a pair of batch files. '* '* Copyright (C) 2002 Microsoft Corporation '* '******************************************************************** OPTION EXPLICIT ON ERROR RESUME NEXT Dim objDomain Dim ObjValue, strServerName, adsLdapPath Dim i 'Get the command-line arguments if Wscript.arguments.count <> 2 Then Print "Invalid Number of Parameters. Use with WalkServers.CMD and WalkObjects.CMD" WScript.quit End If strServerName = Wscript.arguments.item(0) ObjValue = Wscript.arguments.item(1) adsLdapPath = "LDAP://" & strServerName & "/RootDSE" Set objDomain = GetObject(adsLdapPath) If Err.Number <> 0 Then WScript.Echo "Error opening ROOTDSE. Error number is: " & Err.Number & ". Error description is: " & Err.Description & "." Set objDomain = Nothing WScript.quit End If objDomain.Put "RemoveLingeringObject", ObjValue objDomain.Setinfo If Err.Number = 0 Then WScript.Echo "Object " & ObjValue & " was removed." Else WScript.Echo "Object " & ObjValue & " could not be removed. Error number is: " & Err.Number & ". Error description is: " & Err.Description & "." End If WScript.Quit
注意
如果您手動啟動 Modifyrootdse.vbs ,請務必以引弧括住包含空格的任何參數。
建立包含揮之物件的所有全域編錄伺服器清單。 將伺服器名稱放在 相同資料夾中Server-list.txt 檔案中。 使用完整域名來避免 DNS 後綴搜尋。
將您稍早在此程式中取得的 GUID 配對新增至 Object-list.txt 檔案。 每行新增一對。 使用下列語法:
<GUID = <DC GUID>> : <GUID = <object GUID>>
在這裡,第一個值是可寫入域控制器的 GUID,用來確認原始物件已不存在。 第二個值是要移除之揮之物件的 GUID。
執行Walk-servers.cmd檔案。 腳本會針對Server-list.txt檔案中列出的每個全域編錄伺服器產生名為 Update-server-name.log 的記錄檔。 記錄檔包含要刪除之每個物件的一行。
注意
記錄檔中的錯誤不一定表示問題,因為所有全域編錄伺服器上可能不存在揮之不去的物件。 不過,格式為「作業拒絕」或「作業錯誤」的錯誤訊息表示 GUID 或值語法有問題。 如果發生這些錯誤,請確認下列專案:
- 請確定域控制器 GUID 是包含物件之網域可寫入複本之域控制器的正確 GUID。
- 請確定物件 GUID 會識別全域編錄中揮之不去的物件(只讀)命名內容。
執行Walkservers.cmd以修改環境中許多揮之不去的物件時發生錯誤訊息
物件 <GUID=GUID> : <無法移除 GUID=GUID> 。 錯誤號碼為:-2147016672。 錯誤描述為:。
因為腳本會針對未包含內含揮之物件的可寫入分割區之域控制器的 GUID 執行,因此會發生此錯誤。 使用Ldp.exe工具來驗證揮之不去的物件位置。
範例
在下列範例中,導致移除錯誤訊息的揮之不去對象位於網域中 corp.company.local
。 不過,<GUID=<GUID>>
來自 objects-list.txt 檔案的 會與網域中company.local
沒有可寫入數據分割的corp.company.local
域控制器相關聯。
ldap_search_s(ld, "DC=company,DC=local", 2, "(cn=User*)", attrList, 0, &msg)
Result <0>: (null)
Matched DNs:
Getting 4 entries:
>> Dn: CN=User\, Joe,OU=Exec,OU=Corporate Users,DC=corp,DC=company,DC=local
1> canonicalName: corp.company.local/Corporate Users/Exec/User, Joe;
1> cn: User, Joe;
1> description: CEO;
1> displayName: User, Joe;
1> distinguishedName: CN=User\, Joe,OU=Exec,OU=Corporate Users,DC=corp,DC=company,DC=local;
4> objectClass: top; person; organizationalPerson; user;
1> objectGUID: <GUID>;
1> name: User, Joe;
>> Dn: CN=User\, Joe,OU=Migration,DC=corp,DC=company,DC=local
1> canonicalName: corp.company.local/Migration/User, Joe;
1> cn: User, Joe;
1> description: Disabled Account;
1> displayName: User, Joe;
1> distinguishedName: CN=User\, Joe,OU=Migration,DC=corp,DC=company,DC=local;
4> objectClass: top; person; organizationalPerson; user;
1> objectGUID: <GUID>;
1> name: User, Joe;
執行下列命令,以取得網域中 corp.company.local
伺服器的 GUID:
repadmin /showreps <dcname>
在此命令中, <dcname>
是網域中域控制器名稱的 corp.company.local
佔位元。 變更Objects-list.txt檔案中的 GUID,以符合網域中域控制器的 corp.company.local
GUID。 在此範例中 ,Objects-list.txt 檔案會顯示為:
<GUID=<GUID>> : <GUID=<GUID>>
第一個 <GUID>
是網域中域控制器的 corp.company.local
GUID。 第二 <GUID>
個是LDAP搜尋中揮之物件的 GUID。
當您執行 Walk-servers.cmd時,命令現在會順利完成,而不會發生 “-2147016672” 錯誤。
如果您無法使用這些方法來解決記錄檔中的錯誤,您可能會遇到不同的問題。 請連絡 Microsoft產品支援服務以取得其他協助。