In Exchange Online, we can use the Get-CalendarDiagnosticObjects cmdlet to get calendar event diagnostic logs within a date range. You can also filter the logs by meeting subject and find the events by unique global object ID (GlobalObjectId). We can use the diagnostic logs to track important calendar-related event data for each user mailbox and can be used to troubleshoot calendar issues that you face in Outlook and Microsoft Teams calendar.
Before start, install the Exchange Online PowerShell V2 module and run the below command to connect Exchange Online PowerShell.
Connect-ExchangeOnline
Explore Calendar Diagnostic Objects
Run the following command to retrieve the calendar event logs for all meetings with the Subject text “Sales Team Meeting” in the user mailbox “Kevin Morgan”. The parameter -ExactMatch force to exact match with subject text instead of contains check.
Get-CalendarDiagnosticObjects -Identity "Kevin Morgan" -Subject "Product Team Meeting" -ExactMatch $true
Multiple action items logged for a single calendar meeting event under all attendees based on their action. The property CalendarLogTriggerAction indicates the action that’s taken on the item (for example, Create or Update) and the ResponseType indicates whether the attendee accepted or declined the meeting request. Each log item might have a different LastModifiedTime, but all items have a unique global object ID (GlobalObjectId).
Users might have scheduled multiple meetings with the same Subject. In this case, to narrow down the logs first run the above command and find the GlobalObjectId for the required meeting by comparing other properties such as LastModifiedTime, DisplayAttendeesAll, StartTime, EndTime, and more.
Run the following command to retrieve the logs for a particular meeting by its GlobalObjectId.
Get-CalendarDiagnosticObjects -Identity "Kevin Morgan" -MeetingID 40000008200E00074C5B7101A82E00800000000693ADAA3B5FCD201000000000000000010000000FF760A70460EAA4096B879872DF24F49
We can also filter the logs by start and end dates. The below command exports logs between two dates.
Get-CalendarDiagnosticObjects -Identity "Kevin Morgan" -Subject "Team Meeting" -StartDate 6/1/2020 -EndDate 6/30/2020 |
Export-Csv "C:\Users\admin\Documents\Team_Meeting_logs.csv" -NoTypeInformation
Troubleshoot Calendar Event issues
As we already explained, a series of events will be generated when you schedule a meeting for all meeting attendees. For example, consider the user “Kevin Morgan” scheduled a meeting with two users “Alex Wilber” and “Allan Darrow”. In this case, we need to generate logs for all three users for the same event. We can export the meeting logs to a CSV file for all three users and compare the event properties to narrow down the problem.
Run the following command three times (for Kevin Morgan, Alex Wilber, and Allan Darrow) after changing mailbox identity and log file path.
Get-CalendarDiagnosticObjects -Identity "Kevin Morgan" -Subject "Product Team Meeting" -StartDate 6/1/2020 -EndDate 6/30/2020 |
Select SubjectProperty, GlobalObjectId, StartTime, EndTime, LastModifiedTime, CalendarLogTriggerAction,ItemClass,CalendarOriginatorId,DisplayAttendeesAll,ResponseType |
Export-Csv "C:\Users\admin\Documents\Kevin_Meeting_logs.csv" -NoTypeInformation
Compare All Attendees Calendar Logs
Once you exported the logs, troubleshoot the issue by checking the logs with the following properties. You can see more properties in the log file.
- SubjectProperty: Title text of the meeting
- StartTime: Start time of the meeting
- EndTime: End time of the meeting
- AppointmentState: 1 = The appointment is a meeting, 2 = The appointment has been received, 4 = The appointment has been cancelled, and 8 = the appointment is a forwarded appointment.
- CalendarLogTriggerAction: The action that’s taken on the item (for example, Create or Update).
- OriginalLastModifiedTime: Used as the primary sort field to order the events.
- ResponseType: 0 = The organizer hasn’t received a response, 1 = The organizer’s copy of the meeting, 2 = Tentative, 3 = Accept, 4 = Decline, or 5 = The attendee hasn’t responded.
- CalendarOriginatorId: The user who scheduled the meeting. Possible value -> (xxxxxxxx-dcba-19h3-u420-fc13e4388c76;/o=ExchangeLabs/ou=Exchange Administrative Group (FYDIXOHY23SPDLT)/cn=Recipients/cn=13ee2989e966402bb1eecff18af62959-KevinM). The first part of guid value indicates the Office 365 user mailbox property ExchangeGuid and last part of text (ex: -KevinM) indicates the user’s mailbox identity. You can run Get-Mailbox command with the ExchangeGuid or identity value and find the user’s Azure AD object id from the property ExternalDirectoryObjectId.
- DisplayAttendeesAll: Attendee names as a semi-colon separated values (ex: Alex Wilber; Allan Darrow)
- ReceivedBy : The attendee user who received the meeting invite.
- ResponsibleUserName: The LegacyExchangeDN value of the user who made the change
Any idea how to delete an event based on CalendarOriginatorId ?