如何用PowerShell提取AD组内活跃未过期用户的姓名与邮箱?
解决AD组活跃成员筛选的PowerShell脚本问题
原脚本的核心问题
- 邮箱匹配逻辑错误:
$_.mail -like '@domain.com'缺少通配符*,只会匹配邮箱完全等于@domain.com的用户,无法筛选指定域名下的正常邮箱。 - 逻辑运算符优先级混乱:
-and优先级高于-or,原条件被解析为(邮箱匹配 且 过期日期在未来) 或者 (无过期日期 且 账户启用),不符合“同时满足账户启用、邮箱匹配、未过期”的需求。 - 括号使用不当:添加括号时未正确包裹过期日期的判断单元,导致条件逻辑失效,无结果返回。
修正后的脚本
Get-ADGroupMember 'Employees' | Get-ADUser -Properties Enabled, EmailAddress, AccountExpirationDate | Where-Object { $_.EmailAddress -like '*@domain.com' -and $_.Enabled -eq $true -and ($_.AccountExpirationDate -eq $null -or $_.AccountExpirationDate -gt (Get-Date)) } | Select-Object GivenName, Surname, EmailAddress, AccountExpirationDate | Export-Csv -Path "export.csv" -NoTypeInformation
关键修正点说明
- 邮箱匹配修正:将
@domain.com改为*@domain.com,用通配符匹配所有domain.com域名下的邮箱。 - 逻辑条件梳理:明确筛选逻辑为同时满足:
- 邮箱属于指定域名
- 账户处于启用状态
- 账户无过期日期 或 过期日期在未来(用括号包裹这两个子条件,确保
-or仅作用于过期日期的判断)
- 属性名称统一:用
EmailAddress替代mail,和Get-ADUser获取的属性名称保持一致,避免歧义。
内容的提问来源于stack exchange,提问作者Scott Dyreson
相关产品推荐
相关产品推荐

