在Exchange中的所有SMTP地址之前添加“_”

时间:2014-07-02 09:21:16

标签: email powershell exchange-server powershell-v3.0

我正在寻找帮助我在Exchange中的所有SMTP地址之前添加“_”的脚本。

假设我们有一位用户John Doe。 John有3个不同的SMTP地址:

john.doe@contoso.com

jdoe@domain.com,

john@contoso.com

我想更改禁用Exchange中的所有功能(如OWA,ActiveSync等),在GAL中隐藏其帐户并将其所有地址设置为:

_john.doe@contoso.com

_jdoe@domain.com,

_john@contoso.com

我可以为主SMTP做这件事,但我不能为其他人做这件事:(

现在我尝试了这样的解决方案:

Set-Mailbox $sam -HiddenFromAddressListsEnabled $true -DomainController $dmc
Set-CasMailbox $sam -OWAEnabled $false -ActiveSyncEnabled $false -MAPIEnabled $false -PopEnabled $false -ImapEnabled $false -DomainController $dmc
mbx = Get-Mailbox $sam -DomainController $dmc | select -expand EmailAddresses | %{$_.SmtpAddress}

        foreach ($M in $mbx)
        {
           [string]$email += "'smtp:_"+$M+"',"
        } 

但它对我不起作用。我在PS中很新鲜,所以请你帮助我。

1 个答案:

答案 0 :(得分:0)

多个问题:

  1. 主要问题是您正在生成新地址列表,但您并未修改邮箱对象。只针对从邮箱查询的结果运行 foreach 循环并不会修改该对象。您需要使用 Set-Mailbox 来实际设置新地址:

    Set-Mailbox -EmailAddresses <new_addresses>
    
  2. 您创建字符串的方式,它将有一个尾随逗号。如果要从循环生成的字符串创建逗号分隔的字符串,请按以下方式执行:

    $email = $(foreach ($m in $mbx) {
        "'smtp:_" + $m + "'"
    }) -join ','
    

    循环返回每次迭代生成的字符串数组,-join ','将它们连接成逗号分隔的字符串。

  3. 也就是说,实际上想要将它们加入逗号分隔的字符串中,因为 -EmailAddresses 参数Set-Mailbox 采用数组参数。所以,你只想使用循环的返回值作为参数。

  4. 添加smtp:前缀是不必要的,因为它是默认值。

  5. 另一方面,如果您只修改SMTP地址,则执行想要使用 Where-Object 来过滤内容SMTP地址的 EmailAddresses 属性:

    ?{$_.Prefix.ToString() -eq 'smtp'}
    
  6. 全部放在一起:

    foreach ($mbx in (Get-Mailbox <whatever>)) {
      $modified_addresses = $mbx.EmailAddresses `
      | ?{$_.Prefix.ToString() -eq 'smtp'} `
      | select -ExpandProperty EmailAddresses `
      | %{"_$_"}
      Set-Mailbox $mbx -EmailAddresses $modified_addresses
    }