Restore multiple deleted Active Directory objects
- Details
- Category: KB
- Published on 03/10/2012
- Hits: 10007
คราวที่แล้วเราได้ทดลอง Restore Account แบบทีละ Account กันไปแล้ว ซึ่งเป็นกรณีที่เผลอลบผิดพลาดไปแบบไม่เยอะเท่าไหร่ แต่คราวนี้หากมีการเผลอลบ Organization Unit (OU) หายไปเลย แถมไม่ได้มีการป้องกันการลบไว้ด้วย ซึ่งจะทำให้ OU ที่อยู่ภายในและ User Account ทั้งหมดหายไปกับตา ถ้าไม่อ่านแล้วจะเสียใจนะเออ
เมื่อครั้งแรกที่เราสร้าง Organization Unit (OU) ขึ้นมา จะมีตัวเลือก Protect container from accidental deletion ซึ่งมีไว้สำหรับป้องกันความผิดพลาดจากการลบ OU ทิ้งไปโดยไม่ตั้งใจ
แต่ถึงแม้จะตั้งใจหรือไม่ตั้งใจก็ตาม เมื่อมีการลบ Object OU ออกไปจาก Active Directory แล้ว และต้องการกู้คืนกลับมาให้เหมือนเดิมมันก็ต้องมีเทคนิคกันหน่อย โดยบททดสอบนี้ผมได้จัดเตรียม OU และ Users ไว้ดังนี้
เป้าหมายของเราตอนนี้มี OULevel1 ซึ่งมี 2 Users คือ user1 และ user2 และภายในนี้ก็ยังมี OULevel2 ซ้อนอีกชั้นโดยมี usera อยู่ใน OU นี้ด้วย ปัญหาจะเกิดขึ้นก็หลังจากที่เราลบ OULevel1 ออกไปนี่แหล่ะ จะทำให้ทุก Object ที่อยู่ใน OULevel1 นั้นหายไปด้วยเช่นกัน
แล้วก็อีกเช่นเคยอย่างที่ได้เคยกล่าวไว้ในบทความก่อน ๆ Object ที่ถูกลบไปนั้นจะถูกนำไปจัดอยู่ใน Container พิเศษที่ชื่อว่า Deleted Objects ซึ่งจะยังไม่ได้ถูกลบไปจริง ๆ แต่เป็นเพียงการทำเครื่องหมายไว้เท่านั้นว่ามันถูกลบไปแล้ว ซึ่งเราควรจะทำการตรวจสอบเสียก่อนว่า Object ที่เราจะ Restore นั้นเค้าอยู่กันอย่างไร
เริ่มที่ Start > Administrative Tools > เรียก Active Directory Module for Windows PowerShell ด้วย Run as administrator
เราจะค้นหา Object ด้วยคำสั่ง Get-ADOBject โดยใช้ Parameter ldapFilter และวางเงื่อนไขการค้นหาโดยใช้ Attribute ที่เกี่ยวข้องกับตัว Object ที่ถูกลบไป ซึ่งจะเลือกใช้ Attribute msDS-lastKnownRDN โดยรูปแบบคำสั่งจะเป็นดังนี้
Get-ADObject -SearchBase "CN=Deleted Objects,DC=domain,DC=local" -ldapFilter:"(msDs-lastKnownRDN=user2)" -IncludeDeletedObjects -Properties lastKnownParent
จากผลลัพธ์จะทำให้ทราบว่า Object user2 นี้ได้ถูกลบไปแล้วจริง ๆ ไม่ได้โม้ และเคยอยู่ใน OULevel1 มาก่อน
หลังจากการตรวจสอบอย่างง่าย ๆ แล้วพบว่าสามารถแสดงรายการของ OULevel1 ออกมาได้แล้ว คราวนี้เราจะลองค้นหารายละเอียดของ OULevel1 ที่ถูกลบไปบ้าง โดยพิมพ์คำสั่ง
Get-ADObject -SearchBase "CN=Deleted Objects,DC=domain,DC=local" -Filter {lastKnownParent -eq 'OU=OULevel1\\0ADEL:a645eeb4-cb56-463d-9742-57f9d99b8d89,CN=Deleted Objects,DC=domain,DC=local'} -IncludeDeletedObjects -Properties lastKnownParent | ft
ซึ่ง Value ของ OU นั้น ให้เรา Copy มาจากผลลัพธ์แรกได้เลย และแก้ไข \ จากเดิมให้เป็น \\ ด้วย
ผลลัพธ์ออกมาจะเห็นว่า ภายใน OULevel1 นั้น มี Object อะไรอยู่บ้าง แต่เรายังมองไม่เห็น Object ที่อยู่ใน OULevel2 ดังนั้นเราจึงต้องใช้คำสั่งเพื่อตรวจสอบ OULevel2 ก่อน ซึ่งจากผลลัพธ์นี้ทำให้เราไม่สามารถเห็นเลข ObjectGUID ได้หมด ดังนั้นจึงต้องทำการหาเลข ObjectGUID ของ OULevel2 ด้วยคำสั่ง
Get-ADObject -SearchBase "CN=Deleted Objects,DC=domain,DC=local" -ldapFilter:"(msDs-lastKnownRDN=OULevel2)" -IncludeDeletedObjects -Properties lastKnownParent
แล้วเอา ObjectGUID ของ OULevel2 ที่ได้ไปตรวจสอบอีกครั้งด้วยคำสั่ง
Get-ADObject -SearchBase "CN=Deleted Objects,DC=domain,DC=local" -Filter {lastKnownParent -eq 'OU=OULevel2\\0ADEL:cc59fc1a-9bd4-462b-abb2-b1229fe69c8c,CN=Deleted Objects,DC=domain,DC=local'} -IncludeDeletedObjects -Properties lastKnownParent | ft
จะทำให้ทราบว่า มี Object อะไรอยู่ภายใต้ OULevel2 อีกบ้าง
พบว่ามี usera อยู่ภายใน OULevel2 อีก
เมื่อทราบโครงสร้าง Object ที่ถูกลบไปแล้วว่า มีลำดับชั้นเป็นอย่างไรบ้าง การ Restore กลับมาเราก็จะต้องทำตามลำดับขั้นเช่นเดียวกัน โดยจะต้อง Restore Object ที่อยู่บนสุดก่อน ไล่ไปจนถึง Object ที่อยู่ล่างสุด โดยจะใช้คำสั่ง Restore-ADObject เข้ามาใช้งานร่วมด้วย
Restore OULevel1
Get-ADObject -ldapFilter:"(msDS-LastKnownRDN=OULevel1)" -IncludeDeletedObjects | Restore-ADObject
Restore Object ที่อยู่ใน OULevel1 ทั้งหมด
Get-ADObject -SearchBase "CN=Deleted Objects,DC=domain,DC=local" -Filter {lastKnownParent -eq "OU=OULevel1,DC=domain,DC=local"} -IncludeDeletedObjects | Restore-ADObject
เป็นการ Restore ทุก Object ที่ถูกลบไปอยู่ใน Container Deleted Objects ทั้งหมด ดังนั้นจึงไม่ได้มีการระบุชื่อ Users
สุดท้าย Restore OULevel2 และทุก Object ที่อยู่ใน OULevel2 มาด้วย
Get-ADObject -SearchBase "CN=Deleted Objects,DC=domain,DC=local" -Filter {lastKnownParent -eq "OU=OULevel2,OU=OULevel1,DC=domain,DC=local"} -IncludeDeletedObjects | Restore-ADObject
เสร็จแล้ว ทุก OU ละ Users กลับมาอยู่ในสภาพเดิม