如何在Get-MailboxPermission PowerShell中移除禁用的AD用户
问题描述
我正在从Exchange Online导出所有共享邮箱权限,导出成功但结果中包含大量禁用用户。问题在于:尽管我们使用Azure AD同步,但AD中禁用的用户在O365中仍标记为活跃,无法直接使用过滤功能。我尝试导出活跃AD用户的UPN到CSV,再导出共享邮箱权限,导入两个CSV后用Compare-Object进行对比,但未能成功实现过滤。我还尝试移除数组中SideIndicator不为'=='的条目,但也未能完成。请问是否有其他方法可以在Get-MailboxPermission cmdlet内过滤活跃AD用户?
原始导出代码
#Get All AD Users $ActiveADUsers = Get-ADUser -Filter * | Where {$_.Enabled -eq $True -and $_.userPrincipalName -like '*domain.com'} | Select @{expression={$_.userPrincipalName}; label='User'} ` | Export-Csv -Encoding UTF8 -Path "C:\activeadusers.csv" -Append -NoTypeInformation #Multiple Shared Mailboxes $SharedMailboxes = Get-Mailbox -RecipientTypeDetails SharedMailbox -Resultsize unlimited -Filter {(Name -like "DOMAIN*")} $Results = foreach ($SharedMailbox in $SharedMailboxes) { Get-MailboxPermission $SharedMailbox ` | Select-Object @{expression={$_.Identity}; label='Shared Mailbox'},@{Name='Name';expression={(Get-Recipient $_.user.tostring()).displayname}},User,AccessRights ` | Where-Object {($_.user -like '*@*')} } $Results | Export-Csv -Encoding UTF8 -Path "C:\sharedmailbox-access.csv" -Append -NoTypeInformation
尝试整合的过滤代码(未成功)
$file1 = Import-Csv C:\sharedmailbox-access.csv $file2 = Import-Csv C:\activeadusers.csv $compareParams = @{ ReferenceObject = $file1 DifferenceObject = $file2 } Compare-Object @compareParams -Property userPrincipalName -PassThru -IncludeEqual | Where-Object -Property SideIndicator -eq '==' | select @{expression={$_.Identity}; label='Shared Mailbox'},@{Name='Name';expression={(Get-Recipient $_.user.tostring()).displayname}},User,AccessRights | Export-Csv -Path 'C:\newfile.csv' -Append -NoTypeInformation -Force
解决方案
你遇到的问题核心是CSV列名不匹配、Compare-Object使用逻辑冗余。以下是两种高效的解决方法:
方法一:获取权限时直接过滤活跃用户
无需导出导入CSV,直接在会话内完成过滤,减少文件操作步骤:
# 获取所有活跃AD用户的UPN集合 $ActiveADUserUPNs = (Get-ADUser -Filter {Enabled -eq $True -and userPrincipalName -like '*domain.com'}).userPrincipalName # 获取目标共享邮箱 $SharedMailboxes = Get-Mailbox -RecipientTypeDetails SharedMailbox -ResultSize Unlimited -Filter {Name -like "DOMAIN*"} # 遍历共享邮箱,仅保留活跃用户的权限条目 $Results = foreach ($SharedMailbox in $SharedMailboxes) { Get-MailboxPermission $SharedMailbox | Where-Object { $_.User -like '*@*' -and $ActiveADUserUPNs -contains $_.User } | Select-Object ` @{Name='Shared Mailbox'; Expression={$_.Identity}}, @{Name='Name'; Expression={(Get-Recipient $_.User.ToString()).DisplayName}}, User, AccessRights } # 导出过滤后的结果 $Results | Export-Csv -Encoding UTF8 -Path "C:\filtered-sharedmailbox-access.csv" -NoTypeInformation
方法二:修复CSV对比逻辑
如果坚持使用CSV文件对比,只需修正列名匹配问题,用更直接的判断替代Compare-Object:
# 导入两个CSV文件,提取活跃用户的UPN列表 $mailboxPermissions = Import-Csv C:\sharedmailbox-access.csv $activeUserUPNs = Import-Csv C:\activeadusers.csv | Select-Object -ExpandProperty User # 过滤出权限中属于活跃用户的条目 $filteredResults = $mailboxPermissions | Where-Object { $activeUserUPNs -contains $_.User } # 导出结果 $filteredResults | Export-Csv -Path 'C:\newfile.csv' -Encoding UTF8 -NoTypeInformation -Force
原始对比代码失败原因
- 共享邮箱权限CSV的用户列名为
User,但你用userPrincipalName作为对比属性,导致无法匹配 - Compare-Object适用于双向差异对比,此处仅需单向过滤,用
-contains判断更高效简洁
内容的提问来源于stack exchange,提问作者JGH046
相关产品推荐
相关产品推荐

