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

PowerShell使用Get-ADUser匹配主SMTP地址禁用AD账号问题求助

解决方案

问题根因

原来的命令无法得到正确结果有两个核心原因:

  • Get-ADUser的-Filter参数使用AD专属的WQL查询语法,不支持PowerShell正则运算符-cmatch,也无法解析脚本块内的自定义逻辑,因此第一条命令返回0结果
  • 使用通配符*$_*做模糊匹配时,会命中所有包含对应字符串的代理地址,无法区分大写SMTP:开头的主地址和小写smtp:开头的次级代理地址,因此会匹配到非目标用户

可行实现方案

基础版(适合中小规模AD环境)

# 导入AD模块,需要提前安装RSAT-AD-PowerShell功能
Import-Module ActiveDirectory -ErrorAction Stop

# 导入待处理的邮箱列表,每行一个邮箱
$targetEmails = Get-Content "C:\path\to\your_email_list.txt" | ForEach-Object { $_.Trim().ToLower() }

# 遍历AD用户匹配主SMTP地址
Get-ADUser -Filter * -Properties proxyAddresses | ForEach-Object {
    # 提取当前用户的主SMTP地址(仅匹配大写SMTP:开头的条目)
    $primarySmtp = $_.proxyAddresses | Where-Object { $_ -cmatch '^SMTP:' } | ForEach-Object { $_.Substring(5).ToLower() }
    
    if ($primarySmtp -in $targetEmails) {
        Write-Host "匹配到目标用户:$($_.Name),主SMTP:$primarySmtp"
        # 禁用账户,确认匹配无误后删除-WhatIf参数执行实际操作
        Disable-ADAccount -Identity $_ -WhatIf
        # 如需移动到禁用用户OU,取消注释下面的行,替换为实际OU路径
        # Move-ADObject -Identity $_ -TargetPath "OU=DisabledUsers,DC=contoso,DC=com" -WhatIf
        # 从待处理列表移除已匹配的邮箱,避免重复处理
        $targetEmails = $targetEmails | Where-Object { $_ -ne $primarySmtp }
    }
}

# 输出未匹配到的邮箱,方便人工核对
if ($targetEmails.Count -gt 0) {
    Write-Warning "以下邮箱未找到匹配的主SMTP用户:"
    $targetEmails | ForEach-Object { Write-Warning $_ }
}

优化版(适合万级以上用户的大规模AD环境)

避免全量遍历AD用户,提前构造查询过滤器减少返回结果:

Import-Module ActiveDirectory -ErrorAction Stop
$targetEmails = Get-Content "C:\path\to\your_email_list.txt" | ForEach-Object { $_.Trim().ToLower() }

# 构造AD查询过滤器,先预筛选可能匹配的用户
$filterSegments = $targetEmails | ForEach-Object { "proxyAddresses -like 'SMTP:$_'" }
$adFilter = $filterSegments -join ' -or '

Get-ADUser -Filter $adFilter -Properties proxyAddresses | ForEach-Object {
    # 二次校验确认是大写开头的主SMTP,避免AD查询大小写不敏感导致的误匹配
    $primarySmtp = $_.proxyAddresses | Where-Object { $_ -cmatch '^SMTP:' } | ForEach-Object { $_.Substring(5).ToLower() }
    
    if ($primarySmtp -in $targetEmails) {
        Write-Host "匹配到目标用户:$($_.Name),主SMTP:$primarySmtp"
        Disable-ADAccount -Identity $_ -WhatIf
        # Move-ADObject -Identity $_ -TargetPath "OU=DisabledUsers,DC=contoso,DC=com" -WhatIf
        $targetEmails = $targetEmails | Where-Object { $_ -ne $primarySmtp }
    }
}

if ($targetEmails.Count -gt 0) {
    Write-Warning "以下邮箱未找到匹配的主SMTP用户:"
    $targetEmails | ForEach-Object { Write-Warning $_ }
}

注意事项

  • 所有修改操作默认添加了-WhatIf参数,只会输出模拟操作结果,确认匹配逻辑完全符合预期后再删除该参数执行实际操作
  • 主SMTP地址提取逻辑仅识别大写SMTP:开头的条目,完全规避次级代理地址的干扰
  • 最终输出的未匹配邮箱列表可以用来核对原始邮箱列表中的无效、拼写错误地址

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 09:57:02