How to Check Who Started a Teams Meeting Recording as a Teams Administrator

In this blog post, I'm showing you how you can use Microsoft Graph to check who started a Teams meeting recording as an admin, without being a meeting chat participant yourself.

The Teams Admin Center offers a lot of insights and logs for Teams Administrators. But some meeting related information like attendance reports or meeting chats are only accessible by meeting organizers and participants. Even with Teams administrator access, this kind of information can’t be viewed in TAC.

Let’s assume that you need to check who started a meeting recording for a particular meeting and where that recording was saved. The easiest way to get this information is to just ask the meeting organizer to add you to the meeting so you can check the chat history yourself. This will give you most of the data.

If you can’t get a hold of somebody to add you to a meeting chat, there’s still the Microsoft Graph way which at least gives you some of the data.

System Event Messages

Messages that contain information about chat events, like when somebody was added/removed from a chat or when a meeting recording was started are called system event messages. The messageType in Graph is systemEventMessage for these types of messages. The body doesn’t contain anything besides <systemEventMessage/>.

System event message property example

However, when a message like this is viewed in a Teams chat, it contains much more information.

System event message examples in a chat

For example, a system event message for when a meeting recording was started has a value of ||#microsoft.graph.callRecordingEventMessageDetail| in the chat message’s eventDetail| property.

System event message body System event message for meeting recording started

The initiator property includes an Entra ID user ID to tell us who started a recording.

System event message for meeting recording initiator

Not everything is exposed in Graph

Sadly, Graph doesn’t seem to expose everything. Obviously I can’t say for sure how exactly the Teams client works but it looks very much like that it’s able to access additional data before it determines which end user facing message is displayed in the chat.

For example, when a meeting recording is automatically started by the organizer’s setting, the following message is displayed in the chat.

System event message for automatically started recording

But in Graph, I wasn’t able to find any reference to this. The system message looks just like when the recording was started manually by a participant.

First object: automatically started recording, second object: manually started recording Automatically started recording Manually started recording

I would have expected that when a meeting is recorded automatically by the organizer’s meeting options, that Graph would have some kind of reference under the initiator.application property but that’s not the case.

Also, in my testing, Graph doesn’t differentiate when different users started and stopped a recording. Here is how it looks in Graph. It says that the meeting recording was started and stopped by Evelyn.

Data from Graph

But in the Teams client, it says that the recording was started by Evelyn and stopped by Emma.

Messages in Teams

The only explanation for this is that the Teams client does in fact have access to more data than what’s exposed in Graph.

The data provided by Graph is definitely not perfect but I think it can still be helpful, if you just need to check very basic information, like if a meeting has been recorded at all and where the recording was saved.

Other System Event Messages

Before we get to the script example, let’s take a look at all the different system event message types. These are the system message events I was able to find:

Description @odata.type
Meeting started #microsoft.graph.callStartedEventMessageDetail
Meeting ended #microsoft.graph.callEndedEventMessageDetail
Meeting chat was renamed #microsoft.graph.chatRenamedEventMessageDetail
Meeting recording started/saved/ended #microsoft.graph.callRecordingEventMessageDetail
Meeting transcript started #microsoft.graph.callTranscriptEventMessageDetail
Participant added to the meeting chat #microsoft.graph.membersAddedEventMessageDetail
Participant joined the meeting #microsoft.graph.membersJoinedEventMessageDetail
Participant removed from the meeting chat #microsoft.graph.membersDeletedEventMessageDetail

Meeting Transcript started

One example where the meeting chat in Teams gives you less information than Graph is when a meeting participant starts the meeting transcription. In that case, no message is sent to the meeting chat but there is a system message returned by Graph.

System event message for meeting transcription

However, the system posts a card to the chat with the transcript.

alt text

The Transcript button opens the transcript in a new window which then also shows the details of when and by whom the transcript was started.

Meeting transcript details

Sample Script

You can find a sample script on my GitHub. It requires a service principal with the following application permissions: Chat.Read.All, ChatMessage.Read.All, User.Read.All. The directory includes a script called CreateAppRegistrationAndServicePrincipal.ps1 which will create a new app registration and service principal with the required permissions automatically.

The script will filter the system event messages for meeting recording related events and output them in a grid view.

Script output example

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
Hosted on GitHub Pages
Built with Hugo
Theme Stack designed by Jimmy