需求:编写PowerShell脚本检查Duo导出用户是否在Active Directory中
解决Duo非活跃用户AD查询PowerShell脚本问题
原脚本核心问题梳理
- 语法错误:变量路径未加引号、
GetADUser拼写错误(应为Get-ADUser)、过滤器格式错误、if/else逻辑结构混乱 - 用户名匹配不全:仅按
samAccountName查询,未兼容UPN(登录名)格式 - 错误未捕获:未找到用户时抛出异常,导致else分支无法执行,在无权限使用外部模块的情况下,需用原生PowerShell错误处理方式
修正后的PowerShell脚本
# 定义输入输出路径 $InputFile = "C:\Users\name\desktop\TestingSample1.csv" $OutputFile = "C:\Users\name\desktop\DuoInactiveUser.csv" # 导入CSV并逐个处理用户 Import-Csv $InputFile | ForEach-Object { $username = $_.Username # 假设CSV中用户名列名为Username,根据实际情况修改 $adUser = $null # 先尝试按samAccountName查询 $adUser = Get-ADUser -Filter "samAccountName -eq '$username'" -Properties mail, enabled -ErrorAction SilentlyContinue # 如果没找到,尝试按UPN(登录名)查询 if (-not $adUser) { $adUser = Get-ADUser -Filter "UserPrincipalName -eq '$username'" -Properties mail, enabled -ErrorAction SilentlyContinue } # 构建输出对象 if ($adUser) { [PSCustomObject]@{ '用户名' = $adUser.samAccountName '邮箱' = $adUser.mail '启用状态' = $adUser.enabled } } else { [PSCustomObject]@{ '用户名' = $username '邮箱' = $null '启用状态' = "$username not found." } } } | Export-Csv -Path $OutputFile -NoTypeInformation -Encoding UTF8
关键处理说明
- 双格式用户名兼容:先通过
samAccountName查找,失败后自动尝试UserPrincipalName,覆盖两种用户名格式 - 错误抑制:使用
-ErrorAction SilentlyContinue阻止未找到用户时的异常抛出,确保脚本能继续执行后续逻辑 - 统一输出结构:无论是否找到用户,都输出结构一致的自定义对象,保证
Export-Csv能正确生成规范的CSV文件 - 路径与列名:请根据实际情况修改
$InputFile、$OutputFile路径,以及CSV中的用户名列名(示例中为Username)
内容的提问来源于stack exchange,提问作者Richard Diring
相关产品推荐
相关产品推荐

