Network & remote access
Microsoft Teams (classic and new client)
Microsoft Teams cheat sheet: classic vs new Teams data folders, IndexedDB LevelDB messages and call logs, logs, and Purview or Graph exports as the reference.
- Location
- C:\Users\<user>\AppData\Local\Packages\MSTeams_8wekyb3d8bbwe\LocalCache\Microsoft\MSTeams\
- Proves
- Chats, calls, meetings and file shares cached by the Teams client for a user
- Timestamps
- composeTime and originalArrivalTime as ISO 8601, UTC; call start/end in UTC; log line times whose time zone varies by format
- Retention
- Client cache holds only recently loaded content; LevelDB compaction discards old versions; service copies follow Purview retention
- Access
- User profile files; LevelDB locked while Teams runs, so quit it first; cloud content via Purview eDiscovery or Graph API
- Evidence of
- Network & remote accessUser activity
- Type
- Database
- Windows
- 1011
- KAPE target
- MicrosoftTeams
- Velociraptor
- Windows.Triage.Targets:MicrosoftTeams
Tools
Compare all toolsWhat it is
Microsoft Teams is a web application wrapped in a desktop client. The classic client (1.x) was built on Electron; the new Teams client (2.x, package MSTeams) uses Microsoft Edge WebView2. In both cases the client keeps a local copy of recent conversations, call logs, contacts and meeting data in Chromium storage: IndexedDB and Local Storage, both implemented on top of LevelDB, plus a disk cache and text logs.
Classic Teams has been blocked since 1 July 2025, so current endpoints run the new client, but older images and upgraded profiles still hold classic data. The local cache is only a partial copy: the authoritative record lives in Microsoft 365.
Location
| Client | Path | Content |
|---|---|---|
| Classic Teams (1.x) | %APPDATA%\Microsoft\Teams\IndexedDB\https_teams.microsoft.com_0.indexeddb.leveldb\ | Messages, contacts, call logs, file transfers |
| Classic Teams | %APPDATA%\Microsoft\Teams\Local Storage\leveldb\ | Settings, drafts, meeting and transfer details |
| Classic Teams | %APPDATA%\Microsoft\Teams\Cache\, logs.txt, desktop-config.json, storage.json | Disk cache (images, avatars), activity log, account/config data |
| New Teams (2.x) | %LOCALAPPDATA%\Packages\MSTeams_8wekyb3d8bbwe\LocalCache\Microsoft\MSTeams\ | Root of all client data |
| New Teams | ...\MSTeams\EBWebView\WV2Profile_tfw\ (IndexedDB\, Local Storage\, cache folders) | WebView2 profile: conversations, reply chains, profiles |
| New Teams | ...\MSTeams\Logs\ | Client log files |
| Microsoft 365 | Hidden TeamsMessagesData folder in each participant's Exchange Online mailbox (group mailbox for channels) | Compliance copy searched by Purview eDiscovery |
LevelDB folders must be copied whole (*.ldb, *.log, MANIFEST-*, CURRENT): records live partly in the .log write-ahead file.
What it proves
- Communications: message text, sender, conversation and time for one-to-one chats, group chats, channels and meeting chats cached on this device.
- Calls and meetings: call log entries with participants, direction, start and end times (stored as JSON inside conversation records).
- File sharing: links and names of files shared in chats (the files themselves live in OneDrive or SharePoint).
- Account use: which tenant and account signed in on this device, from
desktop-config.json/storage.json(classic) and logs. - It does not hold a complete history: only what the client synchronised and cached. Absence of a message locally proves nothing; use the tenant's records.
Key fields
| Field / store | Meaning |
|---|---|
conversations store | One record per thread: id, members, topic, threadProperties, lastMessage |
replychains store | Messages grouped by reply chain; message body, sender, composeTime, originalArrivalTime |
Conversation ID 19:…@unq.gbl.spaces | One-to-one chat |
Conversation ID 19:…@thread.v2 / @thread.tacv2 | Group chat / channel |
Conversation ID 19:meeting_…@thread.v2 | Meeting chat |
48:calllogs | Call history thread |
isFromMe (classic) | Direction of the message |
profiles store | Display names, e-mail addresses and IDs of contacts |
Timestamps
| Timestamp | Set when | Format | Pitfalls |
|---|---|---|---|
composeTime | Sender composed/sent the message | ISO 8601 string, UTC | Clock of the sending client |
originalArrivalTime | Service received the message | ISO 8601 string, UTC | Best for ordering across participants |
| Call start / end | Call connected / ended | JSON properties inside the call record, UTC | Missed calls have no duration |
Log line time (logs.txt, Logs\) | Client event | Text timestamp | Check time zone per log format |
Graph createdDateTime, lastModifiedDateTime, deletedDateTime | Service-side creation, edit, deletion | ISO 8601, UTC | Authoritative, but only for what retention still keeps |
Retention and clearing
- The client cache holds what was recently loaded; old conversations may never have been cached on a given device.
- LevelDB compaction rewrites files and discards old record versions, but edited or deleted messages can linger in
.logand older.ldbfiles until compaction runs. - Clearing the Teams cache (Microsoft's documented fix is to delete the
MSTeamsfolder contents) wipes local evidence; recreated folders with recent creation times are a clue. - On the service side, Microsoft Purview retention policies decide how long chats survive in
TeamsMessagesData; a user deleting a message does not remove it from a retained compliance copy.
Collection
- KAPE target:
MicrosoftTeams. It collects the classic%APPDATA%\Microsoft\TeamsIndexedDB, Local Storage, Cache anddesktop-config.json, and a logs path under theMicrosoftTeams_8wekyb3d8bbwepackage. It does not cover the new client'sMSTeams_8wekyb3d8bbwefolder: add it manually. - Velociraptor (
Windows.Triage.Targets):MicrosoftTeams(same coverage and same gap). - Built-in: quit Teams first (LevelDB files are locked while it runs), then copy the whole folder.
robocopy "C:\Users\alice\AppData\Local\Packages\MSTeams_8wekyb3d8bbwe\LocalCache\Microsoft\MSTeams" E:\case\teams-new /E /COPY:DAT /R:1 /W:1
robocopy "C:\Users\alice\AppData\Roaming\Microsoft\Teams" E:\case\teams-classic /E /COPY:DAT /R:1 /W:1
- Cloud: request a Purview eDiscovery export of the custodian's Teams content, or use the Microsoft Graph export APIs (
/users/{id}/chats/getAllMessages,/teams/{id}/channels/getAllMessages, application permissions required), which returnchatMessageJSON.
Parsing tools
- forensicsim (Alexander Bilz, open source):
ms_teams_parser.exeturns a Teams IndexedDB folder into JSON (messages, reactions, contacts, calendar entries), with an Autopsy module. Written for classic Teams; a 2026 study found it unreliable on the new WebView2 client. - dfindexeddb (Google, open source): low-level Chromium IndexedDB/LevelDB parser with JSON output, used to analyse new Teams.
- ccl_chromium_reader (CCL Solutions, open source): Python library that reads Chromium LevelDB, IndexedDB and Local Storage.
- LevelDBDumper (Matt Dawson): dumps raw LevelDB key/value pairs.
- ChromeCacheView (NirSoft): browse the Teams disk cache for images and avatars.
Investigation tips
- Start with the tenant: a Purview or Graph export is complete and attributable, and the local cache then shows what the device actually displayed and when.
- Search LevelDB with a proper parser, not
strings: values are compressed (Snappy) and a keyword search on raw files misses messages. - Use
originalArrivalTimefor ordering and correlate calls with SRUM network usage byms-teams.exeduring the same hour. - Shared files point to OneDrive or SharePoint URLs: check the OneDrive client and browser artifacts for access to them.
- Toast pop-ups for incoming messages may survive in the notification database after the chat itself is gone.
- Deleted or edited messages sometimes remain in older LevelDB records; parse every
.ldband.logfile, not just the current view.
Related artifacts
- Desktop messaging apps (Slack, Signal, WhatsApp…)Desktop messaging forensics: where Slack, Signal, WhatsApp, Telegram and Discord keep data on Windows, what is encrypted, timestamps and export options.
- Browser artifacts (Chrome, Edge, Firefox)Browser forensics cheat sheet: Chromium and Firefox profile files, History and places.sqlite tables, WebKit and PRTime timestamps, downloads, cookies, cache.
- Notification database (wpndatabase.db)Windows notification database cheat sheet: wpndatabase.db tables, toast Payload XML, FILETIME ArrivalTime and ExpiryTime, WAL recovery and legacy appdb.dat.
- OneDrive sync clientOneDrive cheat sheet: account registry keys, SyncEngineDatabase.db and <CID>.dat metadata, ODL logs, SafeDelete.db, Files On-Demand and how to parse them.
- SRUM (System Resource Usage Monitor)SRUM cheat sheet: SRUDB.dat tables and GUIDs, per-app network bytes and CPU time, hourly UTC records, 30 to 60 day retention and ESE repair steps.
Glossary terms
- Triage collectionTargeted acquisition of high-value artifacts (hives, event logs, $MFT, Prefetch) instead of a full disk image, using KAPE or Velociraptor.
- UTC vs local time in Windows artifactsWhy some Windows artifacts record UTC and others local time, and how the TimeZoneInformation registry key helps normalize a forensic timeline.
- Anti-forensicsTechniques used to destroy, hide or falsify evidence, such as log clearing, timestomping, wiping and deleting shadow copies or the USN journal.
- Order of VolatilityThe principle of collecting the most volatile evidence first, before it is lost, as described in RFC 3227.