遇到測試 AD 網域需要清理資料,再次靠 PowerShell 順利達成任務,筆記備忘。

案例一 清除停用員編帳號

因同步程式邏輯失誤,在測試網域殘留一堆已停用的 AD 帳號,有些掛在報廢 OU,致使誤判 OU 仍在使用中,形成大量垃圾資料。故我想使用 PowerShell 找出已停用的員編帳號自動刪除。試出來的可行寫法為:

Search-ADAccount -AccountDisabled -UsersOnly | where { $_.Name -match '\d{5,6}' } | Remove-ADUser

使用 Search-ADAccount 加 -AccountDisabled -UsersOnly 參數查詢出所有被停用的使用者帳號,要清除的對象限定名稱為 5-6 位數字者, 這用 -match 配上 Regular Expression 就能輕鬆解決, 再用 Pipeline 將篩選後的結果送給 Remove-ADUser,一氣喝成將集合中的 AD 帳號全部刪除。

案例二 清除空的 OU

刪完停用 AD 帳號後,留下許多空無一物的 OU,下一步我這些垃圾 OU 清光光。

先看 PowerShell 指令組裝結果:

Get-ADOrganizationalUnit -Filter * | 
Where-Object {-not ( Get-ADObject -Filter * -SearchBase $_.Distinguishedname -SearchScope OneLevel -ResultSetSize 1 ) } |
Set-ADObject -ProtectedFromAccidentalDeletion:$false -PassThru |
Remove-ADOrganizationalUnit

Get-ADOrganizationalUnit 先列出所有 OU, 使用 OU 的 DistinguishedName 當條件查詢 Get-ADObject,限定查詢一層並只取一筆, 配上 -not 讓查到 0 筆時條件成立,就能過濾出沒有任何 AD 物件的 OU。

原本想直接用 Pipeline 串 Remove-ADOrganizationalUnit 刪除但卡在存取被拒。 AD 門外漢查到這是 OU 預設會啟用「Protect object from accidential deletion」保護的原因:

最簡單的解法是用 Set-ADObject -ProtectedFromAccidentalDeletion 停用保護,加上 -PassThru 要求 Set-ADObject 在設定完後繼續將物件向後傳。

最後用 Pipeline 串接 Set-ADObject 傳回的已停用防刪的 OU 物件集合給 Remove-ADOrganizationalUnit,一次清光光,爽!

參考:

Examples of clearing disabled AD accounts and empty OU with PowerShell


Comments

Be the first to post a comment

Post a comment