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
相关产品推荐
相关产品推荐

