我正在寻找帮助我在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中很新鲜,所以请你帮助我。
答案 0 :(得分:0)
多个问题:
主要问题是您正在生成新地址列表,但您并未修改邮箱对象。只针对从邮箱查询的结果运行 foreach 循环并不会修改该对象。您需要使用 Set-Mailbox 来实际设置新地址:
Set-Mailbox -EmailAddresses <new_addresses>
您创建字符串的方式,它将有一个尾随逗号。如果要从循环生成的字符串创建逗号分隔的字符串,请按以下方式执行:
$email = $(foreach ($m in $mbx) {
"'smtp:_" + $m + "'"
}) -join ','
循环返回每次迭代生成的字符串数组,-join ','
将它们连接成逗号分隔的字符串。
也就是说,实际上不想要将它们加入逗号分隔的字符串中,因为的 -EmailAddresses 参数Set-Mailbox 采用数组参数。所以,你只想使用循环的返回值作为参数。
添加smtp:
前缀是不必要的,因为它是默认值。
另一方面,如果您只修改SMTP地址,则执行想要使用 Where-Object 来过滤内容SMTP地址的 EmailAddresses 属性:
?{$_.Prefix.ToString() -eq 'smtp'}
全部放在一起:
foreach ($mbx in (Get-Mailbox <whatever>)) {
$modified_addresses = $mbx.EmailAddresses `
| ?{$_.Prefix.ToString() -eq 'smtp'} `
| select -ExpandProperty EmailAddresses `
| %{"_$_"}
Set-Mailbox $mbx -EmailAddresses $modified_addresses
}