PowerShell:拆分Get-Mailbox中GrantSendOnBehalfTo多值至单独行
解决Exchange邮箱代理发送权限报告的多账户显示问题
最近我在生成Sales Dept邮箱的代理发送权限报告时踩了个坑:单代理账户的时候结果完全正常,但一旦有多个账户,GrantSendOnBehalfTo里的所有值就会被自动拼成一个用空格分隔的字符串。我试着用换行符"n"`来拼接,结果它还是被当成一个带换行的单个字符串,根本没法把各个代理账户分开看。
我最开始用的代码是这样的:
get-mailbox "Sales Dept" | select identity,displayname,@{l='SendOnBehalfOf';e={$_.GrantSendOnBehalfTo -join "`n"}}
后来摸索出两个靠谱的解决办法,分享给你:
方法1:生成结构化的多行报告(适合导出或后续处理)
这个方法会给每个代理账户单独生成一条记录,不管是查看还是导出成CSV都非常清晰:
Get-Mailbox "Sales Dept" | ForEach-Object { $currentMailbox = $_ # 遍历每个代理账户,生成独立的对象 foreach ($proxyAccount in $currentMailbox.GrantSendOnBehalfTo) { [PSCustomObject]@{ Identity = $currentMailbox.Identity DisplayName = $currentMailbox.DisplayName SendOnBehalfOf = $proxyAccount } } }
方法2:控制台显示时每行一个代理(仅控制台查看友好)
如果只是想在控制台里让每个代理账户单独占一行显示,不用改变整体结构,可以用Out-String -Stream处理数组:
Get-Mailbox "Sales Dept" | Select-Object Identity, DisplayName, @{ Name = 'SendOnBehalfOf' Expression = { $_.GrantSendOnBehalfTo | Out-String -Stream } }
为啥之前的方法不行?
其实GrantSendOnBehalfTo本身是一个数组类型的属性,当你用-join "n"`把它转换成字符串后,它就从数组变成了单个字符串值——哪怕里面有换行,本质还是一个字符串。所以要保留每个代理的独立性,就得直接遍历数组生成单独条目,而不是把数组拼成字符串。
内容的提问来源于stack exchange,提问作者Namuna
相关产品推荐
相关产品推荐

