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

PowerShell脚本:如何在用户跨OU移动时自动调整AD安全组成员身份

PowerShell AD用户OU与同名安全组自动同步脚本

前置要求

  • 运行环境需预先安装ActiveDirectory PowerShell模块(域控制器默认自带,成员终端可通过安装RSAT-AD-PowerShell功能获取)
  • 执行账号需拥有AD用户组成员修改、AD对象查询权限
  • 所有OU对应的同名安全组已提前在AD中创建完成

实现逻辑

  • 扫描指定根OU下的所有AD用户,自动匹配用户当前所在OU的同名安全组
  • 自动清理用户所属的、非当前OU对应的其他同名OU安全组
  • 自动将用户加入当前OU对应的同名安全组

OU结构参考:
OU结构示意图

完整脚本

# 导入AD模块
Import-Module ActiveDirectory -ErrorAction Stop

# -------------------------- 请修改以下参数为实际环境值 --------------------------
# 要扫描的根OU可分辨名称
$rootOU = "OU=你的根OU名称,DC=你的域名,DC=com"
# ------------------------------------------------------------------------------

# 获取根OU下所有启用的AD用户
$allUsers = Get-ADUser -Filter * -SearchBase $rootOU -SearchScope Subtree

foreach ($user in $allUsers) {
    # 获取用户当前所在OU的名称
    $userOUPath = $user.DistinguishedName.Split(',', 2)[1]
    $currentOU = Get-ADOrganizationalUnit -Identity $userOUPath
    $currentOUName = $currentOU.Name

    # 查找当前OU对应的同名安全组
    $targetGroup = Get-ADGroup -Filter "Name -eq '$currentOUName'" -ErrorAction SilentlyContinue
    if (-not $targetGroup) {
        Write-Warning "未找到OU[$currentOUName]对应的同名安全组,跳过用户$($user.SamAccountName)的处理"
        continue
    }

    # 获取用户当前所有所属组,过滤出所有和OU同名的安全组
    $userAllGroups = Get-ADPrincipalGroupMembership -Identity $user
    $ouRelatedGroups = $userAllGroups | Where-Object { $_.Name -in (Get-ADOrganizationalUnit -Filter * -SearchBase $rootOU | Select-Object -ExpandProperty Name) }

    # 移除不属于当前OU的同名安全组
    foreach ($group in $ouRelatedGroups) {
        if ($group.Name -ne $currentOUName) {
            Remove-ADGroupMember -Identity $group -Members $user -Confirm:$false -ErrorAction SilentlyContinue
            Write-Host "已将用户$($user.SamAccountName)从旧OU组[$($group.Name)]中移除"
        }
    }

    # 检查是否已加入当前OU的同名组,未加入则添加
    $isInTargetGroup = $ouRelatedGroups | Where-Object { $_.Name -eq $currentOUName }
    if (-not $isInTargetGroup) {
        Add-ADGroupMember -Identity $targetGroup -Members $user -Confirm:$false
        Write-Host "已将用户$($user.SamAccountName)加入当前OU组[$currentOUName]"
    }
}

Write-Host "所有用户同步处理完成"

使用注意

  • 首次测试请在Remove-ADGroupMember和Add-ADGroupMember命令后添加-WhatIf参数,确认执行动作符合预期后再删除该参数正式运行
  • 如需实现自动同步,可将脚本添加到Windows任务计划程序,设置每1-2小时执行一次即可

内容的提问来源于stack exchange,提问作者William Schubach

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 01:00:02