如何通过PowerShell的Get-Mailbox获取多个OU的邮箱权限?
多OU场景下的邮箱权限查询脚本修改方案
你可以通过以下步骤修改脚本,使其支持多个OU的查询,同时修复原脚本中的潜在问题:
修改后完整脚本
# 定义需要查询的OU数组 $ouList = @( "OU=gmsa_accounts,DC=contoso,DC=local", "OU=svc_accounts,DC=contoso,DC=local", "OU=adm_accounts,OU=Users,DC=contoso,DC=local" ) # 初始化邮箱集合(用ArrayList提升性能) $Mailboxes = New-Object System.Collections.ArrayList # 遍历每个OU,收集所有邮箱 foreach ($ou in $ouList) { $ouMailboxes = Get-Mailbox -ResultSize Unlimited -RecipientTypeDetails UserMailbox -OrganizationalUnit $ou if ($ouMailboxes) { [void]$Mailboxes.AddRange($ouMailboxes) } } # 初始化结果集合 $MailboxesResult = New-Object System.Collections.ArrayList # 处理每个邮箱的权限信息 foreach ($Mailbox in $Mailboxes) { # 获取FullAccess权限(修复原脚本中Where-Object的变量错误) $fullAccessPermissions = Get-MailboxPermission -Identity $Mailbox.Alias | Where-Object { !$_.IsInherited -and $_.User -notlike "NT AUTHORITY*" } | Where-Object { $_.AccessRights -eq "FullAccess" } # 获取SendAs权限(同样修复变量错误) $sendAsPermissions = Get-RecipientPermission -Identity $Mailbox.Alias | Where-Object { !$_.IsInherited -and $_.Trustee -notlike "NT AUTHORITY*" } | Where-Object { $_.AccessRights -eq "SendAs" } # 构造结果对象 $item = [PSCustomObject]@{ Name = $Mailbox.DisplayName FullAccess = ($fullAccessPermissions.User -replace '^.+\\') -join ',' SendAs = ($sendAsPermissions.Trustee) -join ',' # 可选:添加OU信息,方便区分邮箱所属OU OrganizationalUnit = $Mailbox.OrganizationalUnit } [void]$MailboxesResult.Add($item) } # 导出结果到CSV $MailboxesResult | Export-Csv -NoTypeInformation C:\Temp\MailboxFolderPermissions2.csv -Encoding UTF8
关键修改点
- 定义多OU数组:把单个OU字符串替换为包含所有目标OU的数组
$ouList,实现批量遍历查询。 - 批量收集多OU邮箱:通过
foreach循环遍历每个OU,调用Get-Mailbox获取对应OU的邮箱,并用ArrayList批量添加,覆盖多OU场景。 - 修复逻辑错误:原脚本中
Where-Object错误使用集合变量判断权限,改为用当前管道对象$_.AccessRights,确保权限判断准确。 - 性能优化:改用
System.Collections.ArrayList替代数组拼接+=,避免频繁重建数组,提升大数量场景下的处理速度。 - 可选增强:新增
OrganizationalUnit字段,方便后续区分每个邮箱所属OU,便于结果分析。
内容的提问来源于stack exchange,提问作者Arbelac
相关产品推荐
相关产品推荐

