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

PowerShell查询CSV列表指定邮箱域90天未登录AD用户报错

PowerShell AD用户查询脚本错误修复

报错根因

你遇到的A positional parameter cannot be found that accepts argument 'Username'报错,核心原因是Get-ADUser的参数使用冲突:

  • 你传入的$_.SamAccountName会被识别为-Identity位置参数,作用是按用户唯一标识精准查询单个AD账号
  • -Identity参数和-Filter筛选参数是互斥的,二者不能同时使用,同时传入就会触发参数绑定错误

之前把邮箱匹配逻辑挪到Where语句后查不到结果,是因为你没有在Get-ADUser的-Properties参数中声明要读取EmailAddress属性:AD用户对象默认返回的属性集不包含邮箱地址,拿不到属性值时判断条件永远不成立,自然匹配不到任何结果。

原脚本其他逻辑问题

  • 冗余查询:既然已经遍历CSV拿到了用户的SamAccountName,不需要再额外加全AD范围的邮箱后缀筛选,浪费查询性能
  • 范围遗漏:原逻辑排除了LastLogonDate为$null的用户,这类用户是创建后从未登录过的账号,本身也符合“最近90天无登录记录”的要求
  • 无效操作:把Sort排序放在ForEach循环内部,对单个用户对象做排序没有实际意义

修正后可直接运行的脚本

# 可根据实际需求修改配置项
$targetEmailDomain = "@thedomain.com"
$noLoginThreshold = (Get-Date).AddDays(-90)
$csvPath = "C:\pathtofile\user.csv"

Import-Csv -Path $csvPath | ForEach-Object {
    # 按CSV中提供的账号查询AD用户,读取后续判断需要的所有属性,跳过不存在的无效账号
    $adUser = Get-ADUser -Identity $_.SamAccountName `
        -Properties SamAccountName, LastLogonDate, EmailAddress `
        -ErrorAction SilentlyContinue
    if (-not $adUser) { return }

    # 匹配两个筛选条件:邮箱后缀符合要求 + 90天内无登录(含从未登录的账号)
    if ($adUser.EmailAddress -like "*$targetEmailDomain" -and 
        ($null -eq $adUser.LastLogonDate -or $adUser.LastLogonDate -lt $noLoginThreshold)) {
        $adUser
    }
} | Sort-Object Name | Select-Object Name, SamAccountName, LastLogonDate, EmailAddress

关键注意点

  • 如果需要导出结果,可以在脚本最后管道后加| Export-Csv -Path "C:\result.csv" -NoTypeInformation -Encoding UTF8直接生成结果文件
  • LastLogonDate属性是AD域控之间同步的非实时属性,同步延迟最长可达14天,如果需要100%精准的最后登录时间,需要查询所有域控的lastLogon属性取最大值,常规合规审计场景用LastLogonDate即可满足需求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 22:45:46