如何用PowerShell查找M365会议组织者并清理离职员工会议
解决离职员工遗留会议室会议的PowerShell脚本方案
问题分析
离职员工账号被禁用后,其发起的会议室会议未取消会持续占用资源,核心难点在于禁用用户的组织者信息可能无法通过常规CmdLet直接匹配,需针对Exchange Online和Microsoft Graph模块分别处理。
Exchange Online模块解决方案
步骤说明
- 确保安装并更新最新模块:
Update-Module ExchangeOnlineManagement - 连接Exchange Online并获取离职员工的LegacyExchangeDN(禁用账号仍可从AD读取该标识)
- 遍历所有会议室,筛选目标会议并执行取消操作
脚本示例
# 连接Exchange Online Connect-ExchangeOnline # 配置离职员工信息 $departedUserUPN = "user@contoso.com" # 从AD获取离职员工的LegacyExchangeDN(需AD模块权限) $departedUserLegacyDN = (Get-ADUser -Identity $departedUserUPN -Properties LegacyExchangeDN).LegacyExchangeDN # 获取所有会议室邮箱 $roomMailboxes = Get-EXOMailbox -RecipientTypeDetails RoomMailbox foreach ($room in $roomMailboxes) { # 定位会议室日历文件夹 $calendarFolder = Get-EXOMailboxFolderStatistics -Identity $room.Identity -FolderScope Calendar | Where-Object {$_.FolderType -eq "Calendar"} if ($calendarFolder) { # 获取日历中所有会议项目 $calendarItems = Get-EXOMailboxFolderItem -Identity "$($room.Identity):\$($calendarFolder.Name)" -ResultSize Unlimited # 筛选离职员工发起的会议(匹配UPN或LegacyExchangeDN) $targetMeetings = $calendarItems | Where-Object { $_.Organizer -eq $departedUserUPN -or $_.Organizer -eq $departedUserLegacyDN } # 批量取消会议 foreach ($meeting in $targetMeetings) { Write-Host "取消会议室 [$($room.DisplayName)] 中的会议: $($meeting.Subject)" Remove-EXOMailboxFolderItem -Identity "$($room.Identity):\$($calendarFolder.Name)" -ItemIds $meeting.Id -Confirm:$false } } }
注意事项
- 运行账号需拥有Exchange Online邮箱读写权限及AD读取权限
- 测试阶段可添加
-WhatIf参数到Remove-EXOMailboxFolderItem,避免误操作 - 若AD无法访问,可通过离职员工未禁用前的Exchange数据导出LegacyExchangeDN
Microsoft Graph模块解决方案
步骤说明
- 更新Graph模块:
Update-Module Microsoft.Graph - 连接Graph并申请必要权限(Calendars.ReadWrite、Directory.Read.All)
- 通过用户ObjectID匹配组织者,遍历会议室取消目标会议
脚本示例
# 连接Microsoft Graph,申请权限 Connect-MgGraph -Scopes "Calendars.ReadWrite", "Directory.Read.All" # 配置离职员工信息 $departedUserUPN = "user@contoso.com" $departedUserId = (Get-MgUser -Filter "UserPrincipalName eq '$departedUserUPN'").Id # 获取所有会议室邮箱 $roomMailboxes = Get-MgUser -Filter "RecipientTypeDetails eq 'RoomMailbox'" foreach ($room in $roomMailboxes) { # 获取会议室日历所有事件 $calendarEvents = Get-MgUserCalendarEvent -UserId $room.Id -All # 筛选离职员工发起的会议(匹配用户ObjectID) $targetEvents = $calendarEvents | Where-Object {$_.Organizer.Id -eq $departedUserId} # 批量取消会议 foreach ($event in $targetEvents) { Write-Host "取消会议室 [$($room.DisplayName)] 中的会议: $($event.Subject)" Remove-MgUserCalendarEvent -UserId $room.Id -EventId $event.Id } }
注意事项
- 若离职员工账号已删除,可通过
$_.Organizer.EmailAddress.Address -eq $departedUserUPN筛选 - 需确保Graph应用或账号拥有会议室日历的读写权限
- 可通过
Get-MgUserCalendarEvent -Filter "Organizer/Id eq '$departedUserId'"优化查询效率,减少本地筛选压力
常见问题排查
- 无法获取组织者信息:禁用用户的Organizer字段可能显示LegacyExchangeDN而非UPN,需提前获取该标识进行匹配
- 权限不足:检查Exchange/Graph权限是否覆盖会议室日历读写及用户目录读取范围
- 模块版本问题:旧版模块可能缺少部分属性支持,务必更新至最新版本
内容的提问来源于stack exchange,提问作者Patrik Westlin
相关产品推荐
相关产品推荐

