如何用PowerShell按修改时间删除指定OU下的AD用户/计算机对象?
使用PowerShell的Remove-ADObject删除指定OU中符合修改时间的AD对象
前提条件
- 已安装Active Directory模块(可通过
Install-WindowsFeature RSAT-AD-PowerShell安装) - 执行脚本的账号拥有删除AD对象及递归访问目标OU的权限
- 务必先在测试环境验证逻辑,避免生产环境误删
具体实现步骤与脚本示例
1. 定义核心参数
先明确目标OU和修改时间阈值(示例为删除30天前修改过的对象,可按需调整):
# 目标OU的Canonical名称列表 $targetOUs = @( "Domain.com/OffBoarded Users", "Domain.com/Old Computers" ) # 计算修改时间阈值(这里设置为30天前,可自定义天数) $modificationThreshold = (Get-Date).AddDays(-30)
2. 遍历OU并筛选符合条件的对象
通过Canonical名称定位OU,递归查找其中的用户和计算机对象,筛选出修改时间早于阈值的条目:
foreach ($ou in $targetOUs) { # 将Canonical名称转换为OU的DistinguishedName(AD模块搜索需要该属性) $ouDN = (Get-ADOrganizationalUnit -Filter "CanonicalName -eq '$ou'").DistinguishedName # 筛选目标OU及其子容器中修改时间过期的用户 $expiredUsers = Get-ADUser -SearchBase $ouDN -SearchScope Subtree ` -Filter { whenChanged -lt $modificationThreshold } -Properties whenChanged # 筛选目标OU及其子容器中修改时间过期的计算机 $expiredComputers = Get-ADComputer -SearchBase $ouDN -SearchScope Subtree ` -Filter { whenChanged -lt $modificationThreshold } -Properties whenChanged # 合并两类待删除对象 $objectsToDelete = $expiredUsers + $expiredComputers
3. 执行删除操作
遍历待删除对象,调用Remove-ADObject完成删除。注意:
-Recursive参数用于删除对象关联的所有子对象(如用户的联系人、计算机的关联记录)- 初次测试时去掉
-Confirm:$false,手动确认删除列表后再批量执行
foreach ($obj in $objectsToDelete) { Write-Host "待删除对象: $($obj.Name) | 最后修改时间: $($obj.whenChanged)" # 执行删除,如需跳过确认提示,添加 -Confirm:$false 参数 Remove-ADObject -Identity $obj.DistinguishedName -Recursive } }
关键注意事项
- 测试验证:先将
Remove-ADObject替换为Write-Host,输出待删除对象列表,确认逻辑无误后再执行删除 - 时间字段:若
whenChanged不符合需求,可改用LastModified属性(部分AD环境启用该扩展属性),对应修改Filter即可 - 权限排查:若出现权限报错,需检查执行账号在目标OU的权限设置,确保拥有「删除所有对象」「递归控制」权限
内容的提问来源于stack exchange,提问作者Senior Systems Engineer
相关产品推荐
相关产品推荐

