๐ Recipe ยท SharePoint & OneDrive
Export a List of Teams Meeting Recordings Stored in User OneDrives
Scan every user's OneDrive for Teams meeting recordings and produce a tenant-wide CSV inventory
Complexity
Intermediate
Impact
audit + storage + compliance + reporting + teams
Context
Why This Matters
Why this matters
Since 2021, Microsoft Teams stores meeting recordings in the organizer's OneDrive for Business (for non-channel meetings) under a /Recordings folder. Over time, these .mp4 files accumulate โ consuming storage, creating data-governance exposure (recordings may contain confidential conversations), and making retention/eDiscovery harder to reason about.
There is no built-in admin report in the M365 Admin Center that shows you every Teams recording across every user. This recipe produces that inventory on demand.
Run this when you need to:
- Audit OneDrive storage consumption driven by meeting recordings
- Identify old recordings for retention-policy cleanup
- Respond to legal/eDiscovery requests involving meeting content
- Offboard a user and want to know what recordings they own
- Validate that Teams recording storage policy is working as expected
Expected Outcomes
What you'll have
- A CSV file (
Teams_Recordings_Report.csv) listing every Teams recording found in user OneDrives - For each recording: owner name, owner UPN, file name, folder path, size (MB), created date, and a direct web link
- Coverage of the standard
/Recordingsfolder plus alternate paths (/Documents/Recordings,Microsoft Teams Chat Files) and a drive-wide.mp4search as a fallback - A repeatable process you can schedule weekly or monthly
Risks & Considerations
Watch out for
- Channel meeting recordings are NOT in OneDrive. Those live in the channel's SharePoint document library. This recipe only covers personal OneDrive. Run a separate SharePoint scan if you need full coverage.
- Legacy Stream (classic) recordings created before the 2021 policy change are in Microsoft Stream, not OneDrive. Check Stream separately if you have pre-2021 data.
- Performance: Iterating every user in a large tenant triggers many Graph calls. Expect throttling (HTTP 429) โ the script should back off or you should run it off-hours.
- Privacy: Meeting recordings can contain confidential conversations. Treat the output CSV as sensitive and store it accordingly.
- Not every
.mp4is a Teams recording. The drive-wide fallback search may surface unrelated video files. Review results before acting on them. - Do not delete recordings based on this report without confirming retention requirements with legal/compliance.
Required Permissions
| Permission | Why It's Needed |
|---|---|
| User.Read.All | Enumerate every user in the tenant to iterate their OneDrive |
| Files.Read.All | Read contents of user OneDrive drives to locate recording files |
| Sites.Read.All | Required if you later extend the scan to SharePoint sites for channel recordings |
The fastest way to get this done: just ask Dex. Copy the prompt below and paste it into your Dex conversation.
For IT Admins
Paste into Dex Pro
Manual walkthrough (per-user, GUI)
There is no native admin report for this in the M365 Admin Center. The GUI path is user-by-user and only practical for spot checks.
Option A โ Check a single user's OneDrive via SharePoint Admin Center
- Sign in to M365 Admin Center with a Global Admin or SharePoint Admin account
- Navigate to
- Search for the target user, select the profile, choose Manage site collection owners, and add yourself as a secondary admin on their OneDrive
- Open the user's OneDrive URL:
https://<tenant>-my.sharepoint.com/personal/<user_upn_with_underscores>/ - Look for a folder named Recordings at the root
- Note file names, sizes, and modified dates manually
Option B โ Purview content search (tenant-wide)
- Go to Microsoft Purview
- Open
- Create a new search. Under Locations, select All OneDrive accounts
- In the query, use:
filetype:mp4 AND (path:"*/Recordings/*" OR filename:"*Recording*") - Run the search, then export the results. The export includes a manifest CSV with file paths, sizes, and owners
Why this is painful at scale: Option A doesn't scale past a handful of users. Option B works but requires eDiscovery licensing and the export step takes hours. For any tenant with more than a few dozen users, use the API or script approach below.
Graph API recipe
There is no single Graph endpoint that lists "all Teams recordings". You build the report by enumerating users, then checking known paths in each user's drive.
Step 1 โ List all users
GET https://graph.microsoft.com/v1.0/users?$select=id,displayName,userPrincipalName&$top=999Paginate via @odata.nextLink until exhausted.
Step 2 โ For each user, list the contents of the Recordings folder
GET https://graph.microsoft.com/v1.0/users/{userId}/drive/root:/Recordings:/children?$select=name,size,createdDateTime,webUrl,fileHandle responses:
- 200 OK โ parse
value[], keep items whosenameends in.mp4/.mkv/.webm - 404 Not Found โ user has no
/Recordingsfolder. Skip silently. - 403 Forbidden โ app lacks
Files.Read.All, or user has no provisioned OneDrive - 429 Too Many Requests โ honor
Retry-Afterheader
Step 3 โ (Optional) Check alternate paths and drive-wide search
Some tenants have recordings under /Documents/Recordings or inside Microsoft Teams Chat Files. As a catch-all, use the drive search endpoint:
GET https://graph.microsoft.com/v1.0/users/{userId}/drive/root/search(q='.mp4')?$select=name,size,createdDateTime,webUrl,parentReferenceExample response item
{
"name": "Weekly Standup-20240315_090312-Meeting Recording.mp4",
"size": 148234752,
"createdDateTime": "2024-03-15T09:32:18Z",
"webUrl": "https://contoso-my.sharepoint.com/.../Recordings/Weekly%20Standup-....mp4",
"file": { "mimeType": "video/mp4" }
}Throttling guidance
Graph enforces per-app and per-tenant throttling. For tenants over ~500 users, batch requests (up to 20 per $batch call) or add a small delay between iterations. Always respect Retry-After.
PowerShell approach
The script below uses the Microsoft.Graph PowerShell SDK. It enumerates every user, probes common recording folders, falls back to a drive-wide .mp4 search, and exports the results to CSV.
Prerequisites
- PowerShell 7+ recommended
Install-Module Microsoft.Graph -Scope CurrentUser- Connect with the scopes:
User.Read.All,Files.Read.All
How it works
Get-MgUser -Allpulls every user and UPN- For each user, the script calls
Get-MgUserDriveRootChildrenon each candidate path (/Recordings,/Documents/Recordings,Microsoft Teams Chat Files) - 404s are caught silently (normal โ not every user has a Recordings folder)
- A drive-wide search for
.mp4picks up recordings in non-standard locations - Duplicates (same user + file name) are suppressed
- Results are exported to
Teams_Recordings_Report.csv
Run it
.\Export-TeamsRecordingsInventory.ps1 -OutputPath "C:\Reports\Teams_Recordings_Report.csv"Expect a few seconds per user. For a 1,000-user tenant, budget 15โ30 minutes and run off-hours to avoid throttling.
Next steps