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

PowerShell脚本处理AD用户DN:迁移至Disabled OU及CN移除问题

PowerShell AD用户禁用迁移脚本问题修复方案

问题1:DN替换不稳定、复用旧OU

原因

手动正则解析DN字符串容易因转义字符、匹配范围不准确出错,且未及时重置变量时会复用之前用户的OU数据。

修复方案

放弃手动解析DN,直接通过AD对象获取父OU路径来构造禁用OU:

  • 每次处理用户都重新拉取最新AD对象数据,彻底避免变量复用问题
  • 基于父OU对象的属性构造禁用OU,无需拼接字符串

问题2:移除CN时处理不完整

原因

原正则无法正确处理包含转义逗号的CN(比如CN=Doe\, John),导致截断位置错误。

修复方案

通过AD对象自带的属性或可靠的组件拆分方式提取OU路径,替代手动正则截断。


修改后的完整代码段

# 获取目标AD用户对象(确保每次处理都是最新数据)
$user = Get-ADUser -Identity $userId -Properties MemberOf, DistinguishedName

# 记录用户所属组到文本文件
$user.MemberOf | Out-File -Path ".\$($user.SamAccountName)_Groups.txt" -Encoding UTF8

# 移除用户所有组
foreach ($group in $user.MemberOf) {
    Remove-ADGroupMember -Identity $group -Members $user -Confirm:$false
}

# 禁用用户账户
Disable-ADAccount -Identity $user

# 迁移至Disabled OU
# 提取用户父OU的完整DN
$parentOuDn = $user.DistinguishedName -replace "^CN=.*?,(OU=.*)$", '$1'
$parentOu = Get-ADOrganizationalUnit -Identity $parentOuDn -ErrorAction SilentlyContinue

if ($parentOu) {
    # 检查父OU名称是否符合"Users - UserType"格式
    if ($parentOu.Name -match '^(.+?)\s*-\s*(.+)$') {
        $baseName = $matches[1].Trim()
        $disabledOuName = "$baseName - Disabled"
        
        # 获取父OU的上级路径,用于定位Disabled OU
        $parentOuParent = $parentOu.DistinguishedName -replace "^OU=.*?,(.*)$", '$1'
        $disabledOu = Get-ADOrganizationalUnit -Filter "Name -eq '$disabledOuName' -and DistinguishedName -like '*$parentOuParent'" -ErrorAction SilentlyContinue
        
        if ($disabledOu) {
            # 移动用户到Disabled OU
            Move-ADObject -Identity $user -TargetPath $disabledOu.DistinguishedName
            Write-Output "User '$($user.SamAccountName)' moved to disabled OU: $($disabledOu.DistinguishedName)"
        } else {
            Write-Warning "Disabled OU '$disabledOuName' not found under $parentOuParent"
        }
    } else {
        Write-Output "Parent OU '$($parentOu.Name)' does not follow 'Users - UserType' naming convention"
    }
} else {
    Write-Output "Failed to retrieve parent OU for user '$($user.SamAccountName)'"
}

关键改进点

  • 全程操作AD对象而非字符串,彻底避免DN解析错误
  • 每次处理用户重新拉取AD数据,解决变量复用/缓存问题
  • 用AD原生命令获取OU,无需手动正则拆分DN
  • 增加Disabled OU存在性校验,避免无效移动操作
  • 组移除、账户禁用逻辑更健壮

内容的提问来源于stack exchange,提问作者Tristen Boring

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 18:52:33