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/>
.
However, when a message like this is viewed in a Teams chat, it contains much more information.
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.
The initiator
property includes an Entra ID user ID to tell us who started a recording.
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.
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.
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.
But in the Teams client, it says that the recording was started by Evelyn and stopped by Emma.
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.
However, the system posts a card to the chat with the transcript.
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.
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.