You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 15:32:54