通过 powershell 批量创建转发地址和联系人

bulk creation of forwarding addresses and contacts via powershell

我正在尝试将邮箱移动到不同 O365 租户上的新 Exchange 服务器。此脚本是此移动的一部分,它试图列出所有拥有许可证的 Exchange Online 用户,为每个用户创建一个指向他们新电子邮件地址的联系人,并将他们的电子邮件转发到他们的新地址以及他们的邮箱

#requires -Version 3 -Modules MSOnline
$mailboxlist = Get-Mailbox | Select-Object -Property userprincipalname | 
Get-MsolUser | Where-Object -Property islicensed -EQ -Value $true | 
Select-Object -Property firstname, lastname, userprincipalname | 
Where-Object -Property firstname -NE -Value $null | 
Format-list -AutoSize


#Begin foreach loop
foreach ($item in $mailboxlist)
{
   #Create the forwarding address
   $forwardingaddress = $item.firstname + '.' + $item.lastname + '@newdomain.com'
   #Check for a contact, add if not present
   If (!(Get-MailContact $forwardingaddress -ErrorAction silentlycontinue)){
        New-MailContact $forwardingaddress -ExternalEmailAddress $forwardingaddress
   }
   #assign forwarding address
   set-mailbox -ForwardingAddress $forwardingaddress -DeliverToMailboxAndForward $true

}

上面的结果是一个 $mailboxlist,其中填充了名字和姓氏以及用户 UPN,这也是一个电子邮件地址。 $forwardingaddress 的结果是 .@newdomain.com.

我认为我没有为 foreach 循环正确创建初始数据。我知道如果我用 $_.firstname 替换 $item.firstname 我会得到相同的空结果。如果了解该主题的人可以提供帮助,我将不胜感激。

谢谢!

编辑:根据 Kiran 的建议进行最终配置

#requires -Version 3 -Modules MSOnline
$mailboxlist = Get-Mailbox |  Get-MsolUser | Where-Object { ($_.islicensed -eq $true) -and ($_.firstname -ne $null) }


#Begin foreach loop
foreach ($item in $mailboxlist)
{
    #Create the forwarding address
    $forwardingaddress = $item.firstname + '.' + $item.lastname + '@newdomain.com'
    #Remove any spaces from the email address
    $forwardingaddress = ($forwardingaddress -replace " ","").trim()
    #Check for a contact, add if not present
    If (!(Get-MailContact $forwardingaddress -ErrorAction silentlycontinue))
    {
        New-MailContact $forwardingaddress -ExternalEmailAddress $forwardingaddress
    }
    #assign forwarding address
    Set-Mailbox -ForwardingAddress $forwardingaddress -DeliverToMailboxAndForward $true
}

试试这个:

$mailboxlist = Get-Mailbox |  Get-MsolUser | 
    Where-Object { ($_.islicensed -eq $true) -and ($_.firstname -ne $null) } 

get-MsoluserUserPrincipalName 接受属性名称的管道输入,因此您应该将 get-mailbox 的输出通过管道传输到 get-msoluser

select-object 应优先于 format-* 命令,因为创建的对象类型。

如果要在控制台上显示数据,请使用 format*

where-object 子句允许您创建复杂的条件,因此请尽量将它们结合起来。这应该是命令的流程:

cmdlet | where-object { some condition(s)} | select properties