PowerShell批量创建邮件联系人报错:ExternalEmailAddress无法转换ArrayList
问题描述
我的目标
使用PowerShell批量创建邮件联系人。手动输入ExternalEmailAddress时程序可正常运行,但因需创建的邮件联系人数目庞大,无法手动操作。不清楚问题出在哪里,恳请帮忙排查!
我的代码
$UserCredential = Get-Credential $Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http://xxx.yyy.com/PowerShell/ -Authentication Kerberos -Credential $UserCredential Import-PSSession $Session -DisableNameChecking Import-Module ActiveDirectory $User = Import-CSV C:\CREATE-MAIL-CONTACT.csv $Params = @{ Name = $user.Name ExternalEmailAddress = $User.PrimarySmtpAddress OrganizationalUnit = "OU=Mail Contacts,DC=xxx,DC=com" } New-MailContact @Params
CSV内容
Displayname Name PrimarySmtpAddress John Smith John Smith john.smith@abc.com
错误信息
执行时出现错误:ExternalEmailAddress can not convert the system.collection.arraylist
解决方案
问题根源是Import-CSV返回的是包含所有行的集合(ArrayList),你直接通过$User.Name和$User.PrimarySmtpAddress传递参数时,会把整个集合的所有值传给New-MailContact,但该命令需要单个对象的属性值,所以报错。
修改代码,添加循环遍历每个用户对象:
$UserCredential = Get-Credential $Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http://xxx.yyy.com/PowerShell/ -Authentication Kerberos -Credential $UserCredential Import-PSSession $Session -DisableNameChecking Import-Module ActiveDirectory # 遍历CSV中的每一条用户记录 foreach ($user in Import-CSV C:\CREATE-MAIL-CONTACT.csv) { $Params = @{ Name = $user.Name ExternalEmailAddress = $user.PrimarySmtpAddress OrganizationalUnit = "OU=Mail Contacts,DC=xxx,DC=com" } New-MailContact @Params }
可选优化:添加错误处理
如果需要排查单个联系人创建失败的原因,可以加入try/catch捕获异常:
$UserCredential = Get-Credential $Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http://xxx.yyy.com/PowerShell/ -Authentication Kerberos -Credential $UserCredential Import-PSSession $Session -DisableNameChecking Import-Module ActiveDirectory foreach ($user in Import-CSV C:\CREATE-MAIL-CONTACT.csv) { try { $Params = @{ Name = $user.Name ExternalEmailAddress = $user.PrimarySmtpAddress OrganizationalUnit = "OU=Mail Contacts,DC=xxx,DC=com" } New-MailContact @Params -ErrorAction Stop Write-Host "联系人 [$($user.Name)] 创建成功" } catch { Write-Host "联系人 [$($user.Name)] 创建失败:$($_.Exception.Message)" -ForegroundColor Red } }
内容的提问来源于stack exchange,提问作者user270488
相关产品推荐
相关产品推荐

