如何修改PowerShell脚本精准移除AD子OU中禁用用户的安全组
问题分析与解决方案
错误原因
你遇到的Get-ADGroup : Directory object not found错误,是因为目标OU(Location1)本身没有存放安全组,用它作为Get-ADGroup的SearchBase自然找不到任何组,导致脚本报错。
另外原脚本逻辑存在问题:遍历组再找组内的禁用用户,会误处理不在目标OU的用户(比如ServiceAcct里的服务账户),因为组可能包含跨OU的用户。
正确思路
应该先精准定位目标OU里的禁用用户,再针对每个用户移除其除主组外的所有安全组成员身份,这样既不会误碰服务账户,也能避免组搜索的错误。
修正后的脚本
# 目标OU的完整LDAP路径:CompanyName > Users > Location1 $targetOU = "OU=Location 1,OU=Users,OU=CompanyName,DC=company,DC=example,DC=com" # 获取目标OU下所有禁用的用户(SearchScope默认是Subtree,会包含子OU;如果不需要子OU改成OneLevel) $disabledUsers = Get-ADUser -Filter { Enabled -eq $false } -SearchBase $targetOU -Properties PrimaryGroupID, MemberOf foreach ($user in $disabledUsers) { Write-Host "处理禁用用户:$($user.Name)" -Foreground Cyan # 获取用户的主组信息(通过PrimaryGroupID匹配) $primaryGroup = Get-ADGroup -Filter { ObjectSID -like "*$($user.PrimaryGroupID)" } # 获取用户所属的所有安全组,排除主组 $groupsToRemove = Get-ADPrincipalGroupMembership -Identity $user | Where-Object { $_.GroupCategory -eq 'Security' -and $_.Name -ne $primaryGroup.Name } foreach ($group in $groupsToRemove) { Write-Host "移除 $($user.Name) 从组 $($group.Name)" -Foreground Yellow Remove-ADGroupMember -Identity $group -Member $user -Confirm:$false # 测试时可以加-WhatIf验证操作 } }
关键说明
- 精准定位用户:直接用
Get-ADUser指定目标OU,只处理该OU下的禁用用户,彻底排除ServiceAcct里的服务账户。 - 保留主组:通过用户的
PrimaryGroupID匹配到主组,过滤掉该组后再移除其他安全组。 - 效率优化:先找用户再处理组,比原脚本遍历组找用户的逻辑更高效,也更贴合需求。
内容的提问来源于stack exchange,提问作者jayz
相关产品推荐
相关产品推荐

