You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 18:04:55