如何从域中将邮箱信息填充至指定表格?PowerShell脚本故障排查
域用户邮箱填充脚本问题解决
待填充表格
| 服务器 | 名称 | 邮箱 |
|---|---|---|
| srv1 | SecondName | |
| srv2 | SecondName | |
| srv3 | ThirdName |
需求:从域中获取对应用户的邮箱信息,填充到上述表格中。使用Get-ADUser编写的PowerShell脚本运行异常,无法实现需求。
原脚本
$CSVpatch = "C:\temp\address.csv" $result = Import-Csv $CSVpatch -Delimiter ";" -Encoding Default | % { $name = $_.name; $server = $_.server; Get-ADUser -Properties * -filter " (DisplayName -eq '$name')" | Select-Object DisplayName, mail} $result | Add-Member -MemberType NoteProperty -Name server -Value $server $result
问题分析
- 变量作用域错误:循环结束后
$server仅保留最后一条记录的值,执行Add-Member时会给所有结果添加同一个服务器名,导致数据关联错误。 - 属性加载冗余:
-Properties *会加载AD用户的所有属性,严重影响脚本运行效率,只需加载mail属性即可。 - 筛选器字符串拼接风险:用双引号包裹筛选器,若用户名包含特殊字符(如单引号)会导致筛选逻辑失效。
- 结果构造逻辑错误:循环内仅输出AD用户的
DisplayName和mail,未同步当前行的服务器信息,事后添加字段的方式逻辑混乱。
修正后的脚本
$CSVpath = "C:\temp\address.csv" $result = Import-Csv $CSVpath -Delimiter ";" -Encoding Default | ForEach-Object { $currentServer = $_.服务器 $currentName = $_.名称 # 仅加载所需的mail属性,提升运行效率 $adUser = Get-ADUser -Properties mail -Filter { DisplayName -eq $currentName } # 构造包含完整信息的自定义对象 [PSCustomObject]@{ 服务器 = $currentServer 名称 = $currentName 邮箱 = if ($adUser) { $adUser.mail } else { "未找到匹配用户" } } } # 输出结果到控制台 $result # 若需要将结果写回原CSV文件,取消下方注释 # $result | Export-Csv -Path $CSVpath -Delimiter ";" -Encoding Default -NoTypeInformation
修正说明
- 循环内直接构造自定义对象,确保每条记录的服务器、名称、邮箱信息一一对应。
- 使用花括号形式的筛选器,避免字符串拼接的特殊字符问题,语法更安全。
- 仅加载
mail属性,大幅减少AD查询的数据传输量,提升脚本速度。 - 添加用户不存在的判断逻辑,避免空值输出,同时给出明确提示。
内容的提问来源于stack exchange,提问作者sychisan
相关产品推荐
相关产品推荐

