如何基于CSV文件用PowerShell发送无效AD账户通知,修复单用户显示问题
问题根源
- 你的CSV表头仅定义了
Manager、inactiveADAccount两列,列分隔符使用了;,但manager_1对应的多个无效账户也用了;分隔,导致ConvertFrom-Csv解析时,只会把第一个;后面的test_1赋值给inactiveADAccount字段,剩余的test_2、test_3会被直接丢弃,所以每封邮件只会显示1个账户。
解决方法
分两步调整即可:
- 调整CSV的字段内容分隔符:把同一个负责人下的多账户分隔符换成非分号的符号(比如逗号、竖线),避免和CSV列分隔符冲突,调整后的示例CSV内容如下:
Manager;inactiveADAccount manager_1@domain.com;test_1,test_2,test_3 manager_2@domain.com.ca;test_4
- 修改PowerShell脚本,拆分多账户内容后再格式化邮件正文,因为你开启了
-BodyAsHtml,可以直接把账户转成HTML列表样式,可读性更好。
修改后完整脚本
# 导入本地CSV文件请把下面的多行字符串替换为 Import-Csv -Path "data.csv" -Delimiter ";" 即可 $Users = @" Manager;inactiveADAccount manager_1@domain.com;test_1,test_2,test_3 manager_2@domain.com.ca;test_4 "@ | ConvertFrom-Csv -Delimiter ";" $SMTPServer = 'mail.domain.com' $FromAddress = New-Object System.Net.Mail.MailAddress 'me@domain.com' ForEach($Manager in $Users) { # 拆分多账户,转换为HTML无序列表 $accountList = $Manager.inactiveADAccount -split ',' | ForEach-Object { "<li>$_</li>" } $accountHtml = "<ul>$($accountList -join '')</ul>" $bodytxt = @" <html> <body> <p>您好:</p> <p>请核实以下超过30天未使用的无效账户:</p> $accountHtml </body> </html> "@ $mailParams = @{ From = $FromAddress To = $Manager.Manager Subject = "无效账户月度提醒" Body = $bodytxt BodyAsHtml = $true SmtpServer = $SMTPServer Priority = "High" Encoding = [System.Text.Encoding]::UTF8 } Send-MailMessage @mailParams }
补充说明
如果你不方便修改CSV里的账户分隔符,仍想保留;分隔多账户,可以调整导入逻辑,无需修改CSV格式:
# 替代原有ConvertFrom-Csv的逻辑,直接读取行拆分内容 $rawLines = Get-Content "data.csv" $Users = for ($i=1; $i -lt $rawLines.Count; $i++) { $parts = $rawLines[$i] -split ';', 2 # 仅按第一个;拆分,后面所有内容都归为inactiveADAccount字段 [PSCustomObject]@{ Manager = $parts[0] inactiveADAccount = $parts[1] } } # 后续拆分账户时把分隔符替换为;即可:$accountList = $Manager.inactiveADAccount -split ';' | ForEach-Object { "<li>$_</li>" }
内容的提问来源于stack exchange,提问作者ak2595
相关产品推荐
相关产品推荐

