如何通过PowerShell将用户管理的多个AD组管理者批量修改为其直属经理
PowerShell AD组管理者批量转移脚本修正
原脚本存在3个核心错误导致无法正常运行:
Get-ADUser返回的manager属性是直属经理的DN字符串,不是AD用户对象,直接调用$Manager.DistinguishedName会返回空值managedObjects属性返回的是所有被管理对象的DN字符串集合,每个元素没有.Group属性,$_.Group调用会报错- 缺少边界场景处理:如果离职用户没有配置直属经理、没有管理任何AD组、或管理的对象包含非组类型(比如OU、计算机账户)时,脚本会抛出异常
修正后的可用脚本如下:
# 读取要操作的用户名 $SamAccountName = Read-Host "Enter the username" # 一次性获取用户的managedObjects和manager属性,减少AD查询次数 $TargetUser = Get-ADUser $SamAccountName -Properties managedObjects, manager # 校验是否配置了经理 if (-not $TargetUser.manager) { Write-Warning "该用户未配置直属经理,终止组管理者转移操作" exit } # 获取经理的完整AD对象 $Manager = Get-ADUser $TargetUser.manager # 校验是否有管理的对象 if (-not $TargetUser.managedObjects) { Write-Host "该用户未管理任何AD对象,无需转移权限" exit } # 遍历所有被管理对象,只处理组类型 $TargetUser.managedObjects | ForEach-Object { $ADObject = Get-ADObject $_ # 只筛选安全组、通讯组进行转移 if ($ADObject.ObjectClass -eq "group") { try { Set-ADGroup -Identity $ADObject.DistinguishedName -ManagedBy $Manager.DistinguishedName -ErrorAction Stop Write-Host "成功转移组 $($ADObject.Name) 的管理者权限给 $($Manager.Name)" } catch { Write-Warning "转移组 $($ADObject.Name) 管理者失败:$_" } } }
可选优化说明:
- 如果需要跳过特定组,可以在筛选条件中添加排除规则
- 如果需要同时转移其他类型AD对象的管理者权限,可以修改
ObjectClass的判断条件 - 批量操作前可以先添加
-WhatIf参数到Set-ADGroup后,预演操作确认没有问题再正式执行
内容的提问来源于stack exchange,提问作者joshua william
相关产品推荐
相关产品推荐

