使用 PowerShell 列出和删除 Exchange 邮箱中的日历事件
PowerShell 允许您访问 Exchange 用户日历中的事件和会议项目。在这篇文章中,我们将了解如何获取日历事件列表或从 Exchange Server 或 Microsoft 365 组织上的所有用户的日历中删除特定事件/约会。
内容:
如何在 Exchange Online (Microsoft 365) 中列出和读取用户日历事件
首先,我们来看看如何获取 Exchange Online (Microsoft 365) 用户邮箱中的日历事件列表。 Microsoft Graph API 可以检索有关用户日历中的项目的信息。首先在 Azure 中注册一个新应用程序(微软Entra ID->应用注册->新注册) 并授予其以下 Microsoft Graph 权限:Calendars.Read和Calendars.ReadBasic.All。

有关在 Azure 中注册应用程序和授予 Microsoft Graph 权限的更多详细信息,请查看文章如何使用 PowerShell 连接到 Microsoft Graph。
现在您可以使用微软Graph连接到 Microsoft 365 租户的模块。在此示例中,我们将在 PowerShell 中使用基于证书的 Azure 身份验证。
$certThumbprint = "9CF05589A4B29BECEE6456F08A76EBC3DC2BC581"
$AzureAppID = "111111-2222-3333-4444-12345678"
$tenant="woshub.onmicrosoft.com"
Connect-MgGraph -AppId $AzureAppID -CertificateThumbprint $certThumbprint -TenantId $tenant
如果缺少 Microsoft.Graph 模块,请安装它:
Install-Module Microsoft.Graph -Scope AllUsers
要查看当前月份特定用户日历中的事件:
$StartDate = (Get-Date -Day 1)
$EndDate = (Get-Date -Day 1).Addmonths(1)
Get-MgUserCalendarView -UserId [email protected] -CalendarId "Calendar" -StartDateTime $StartDate -EndDateTime $EndDate | Select-Object -Property @{Name="EventStart";Expression={ $_.Start.DateTime}},@{Name="EventEnd";Expression={ $_.End.DateTime}},Subject, BodyPreview


该命令返回事件主题、其内容(正文预览)及其开始/结束时间。
使用删除日历事件用于取消(删除)Exchange 日历中的事件(约会、会议)的 cmdlet。它适用于 Exchange Online 和 Exchange Server 2019 组织。
打开 PowerShell 控制台并连接到 Exchange Online 租户(使用 Exchange Online PowerShell 模块)或 Exchange Server 主机。
从用户的日历中删除所有即将举办的活动(未来 15 天内)(由他们组织者):
Remove-CalendarEvents -Identity [email protected] -CancelOrganizedMeetings -QueryWindowInDays 15
或者,您可以删除从特定日期开始的所有事件:
Remove-CalendarEvents -Identity [email protected] -CancelOrganizedMeetings -QueryStartDate 04-10-2023 -QueryWindowInDays 60
您可以使用-PreviewOnly -Verbose用于查看此类事件列表而不删除它们的选项。
Remove-CalendarEvents cmdlet 的主要缺点是它只能删除即将发生的日历事件,并且不允许您按主题、组织者、内容或任何其他属性选择事件。 Remove-CalendarEvents 最常见的用途是快速清除用户日历中由已被解雇、请病假或休假的员工创建的事件。
如果您需要删除过去的事件,或者如果您使用的是本地 Exchange Server 2016/2013/2010,则可以使用搜索邮箱或者新合规搜索用于搜索和删除 Exchange 邮箱中的项目的 cmdlet。
例如,在 Exchange Server 上,您可以查找具有特定主题的日历事件,如下所示:
Search-Mailbox -Identity [email protected] -SearchQuery {Subject:"Discuss: AD Schema Update" AND Kind:meetings AND Received:01/12/2023..15/01/2024} -TargetMailbox report_mbx -TargetFolder SearchMailboxResult –LogOnly -LogLevel Full
此命令在用户邮箱中搜索事件并将结果保存在用户邮箱的 SearchMailboxResult 文件夹中报告_mbx邮箱。
如果您想删除找到的事件,请将最后一个参数替换为-删除内容。以下是删除用户日历中所有事件的方法:
SearchMailbox -identity [email protected] -SearchQuery kind:meetings -DeleteContent
在 Exchange Online 中,SearchMailbox cmdlet 已被弃用,您必须使用合规搜索cmdlet 代替。例如,要查找所有邮箱中具有特定主题的所有事件,请运行以下命令:
New-ComplianceSearch -Name DeleteITMeeting -ContentMatchQuery "kind:meetings AND subject:weekly_it_meeting" -ExchangeLocation all
Start-ComplianceSearch -identity DeleteITMeeting
Get-ComplianceSearc -identity DeleteITMeeting | fl
任务完成后(Status=Completed),您可以删除它找到的事件:
New-ComplianceSearchAction -SearchName DeleteITMeeting -Purge
