Teams Client Update

Der Microsoft Teams Client für Windows ist keine MSI-Datei zur Installation und orientiert sich auch nicht an dem Update-Zyklus von Office 365, sondern macht ein eigenes Ding. Auf dieser Seite versuche ich etwas hinter die Kulissen des Update zu blicken, wie sie Updates kontrollieren und vielleicht blocken können.

Grundlagen

Eigentlich hat Microsoft auf dem "High Level" schon alles auf der Seite "Teams update process (https://learn.microsoft.com/en-us/microsoftteams/teams-client-update)" beschrieben, so dass ich mich hier kurz fassen will:

  • Updates werden üblicherweise am 4. Montag des Monats bereitgestellt.
    Teams orientiert sich dabei nicht an den Office Updates. Natürlich wurden die Clients vorab "rigoros" getestet. Dass das manchmal nicht klappt, habe ich auf Sonderzeichen in Userprofile beschrieben.
  • Ausrollen in Wellen
    An dem besagten 4. Montag bekommen natürlich nicht alle Benutzer gleichzeitig sondern auch hier erfolgt eine Streuung. Es kann also sein, dass einige Anwender schon neue Funktionen sehen, die andere Anwender noch nicht haben.
  • Automatischer UpdateCheck
    Jeder Client prüft alle paar Stunden bei Microsoft auf eine neue Version. Der Benutzer kann das auch anstoßen aber das sollte nie notwendig sein. Microsoft kann steuern, welche Tenants und Client ein Update angezeigt wird.
  • Stiller Download und Installation
    Wenn ein Update ansteht, wird es im Hintergrund heruntergeladen und installiert, wenn der Anwender einige Zeit nicht in Teams aktiv ist.
  • Benutzer muss angemeldet sein
    Es gibt keinen "Update Service", der im Hintergrund eigenständig Updates ausführt.
  • StartupCheck
    Wenn der Client neu startet, prüft er die aktuelle Version und je nach dem, wie alt die Version, startet der Client oder erzwingt erst ein Update

Soweit ich gesehen habe, nutzen alle Teams Anwender mehr oder minder den gleichen Client. Das bedeutet aber nicht, dass jeder Benutzer damit den gleichen Funktionsumfang hat. Zum einen gibt es Teams Richtlinien, über die ein Administrator die ein oder andere Funktion deaktivieren kann. Aber auch Microsoft kann sehr granular Funktionen ein und ausschalten. Ich merke das immer, wenn ich auf meinem Client mit mit unterschiedlichen Benutzern am gleichen Teams-Client anmelde, d.h. regulärer Benutzer, Benutzer mit "Preview", Benutzer im TAP Programm und einem Ring 1.5 Benutzer. Es immer der gleiche Teams Client mit komplett unterschiedlichem Verhalten. Stellen Sie sich das einfach so vor, dass viel mehr Code bereits enthalten ist, der anhängig von der Konfiguration aktiviert oder ausgetauscht wird.

Es gibt noch die Option Teams als "Machine Wide Installation" zu betreiben. Diese kommt eigentlich nur auf TerminalServer zum Einsatz. Hier wird Teams dann nach "C:\Program FIles" installiert aber muss vom Administrator regelmäßig aktualisiert werden. Siehe auch Teams Installation

Update in der GUI

Normalerweise sehen sie nie etwas von der Teams Version. Aber sie können sich die Version anzeigen lassen. Im Punkte-Menü können Sie über "Info" - Version die Version einblenden lassen und über "Nach Update suchen direkt eine Prüfung veranlassen.

Die manuelle Suche nach Updates macht eigentlich nur Sinn, wenn Sie als Administrator oder Supporter eine zu alte Version nachverfolgen wollen, denn Teams macht diesen Check selbst mehrfach am Tag. Sie können die Update-Prüfungen in Logdateien nachvollziehen. Der Anwender sieht entsprechende Meldungen direkt am oberen Rand:

  • Anzeige der aktuellen Version und der letzten Aktualisierung, wenn Sie diese über "Info - Version" anfordern
  • Anzeige, wenn Sie manuell eine Suche angestoßen haben
  • Ein Update wurde im Hintergrund heruntergeladen und steht nach dem Teams-Neustart bereit

Aber mich interessierte, was dahinter passiert und wie ich die Schritte im Fehlerfall analysieren und ggfls. korrigieren kann. Eine gute Quelle ist die Datei "%APPDATA%\Microsoft\Teams\logs.txt" mit einer Suche nach "Checking for update".


Auszug aus %APPDATA%\Microsoft\Teams\logs.txt

Hier sind gut die Intervalle mit ca. 4h Abstand zu sehen

Update-Konfiguration

Wenn Sie auf dem Teams Client mit ALT-CTRL-SHIFT-1 sich die Diagnoselogs exportieren lassen, dann können Sie in der Datei "Settings.json" sehr gut die konfigurierten Updatequellen sehen. Hier nur ein Auszug:

{
   "settings": {
      "serviceEndpointInfoMap": {
         "https://teams.microsoft.com": {
            "update": {
               "pds": {
                  "hostname": "https://teams.microsoft.com",
                  "endpointPath": "/desktopclient/update",
                  "params": "/{{appVersion}}/{{os}}/{{architecture}}"
               },
               "feServer": {
                  "hostname": "https://teams.microsoft.com",
                  "endpointPath": "/desktopclient/update",
                  "params": "/{{appVersion}}/{{os}}/{{architecture}}"
               }
            },

Je nach Umgebung (Siehe auch Clouds von Microsoft) gibt es unterschiedliche Quellen:

https://teams.microsoft.com        https://teams.microsoft.com/desktopclient/update/{{appVersion}}/{{os}}/{{architecture}}"
https://devspaces.skype.com        https://devspaces.skype.com/desktopclient/settings/{{appVersion}}/{{os}}/{{architecture}}
https://local.teams.office.com     https://local.teams.office.com/desktopclient/settings/{{appVersion}}/{{os}}/{{architecture}}
https://gov.teams.microsoft.us     https://gov.teams.microsoft.us/desktopclient/update/{{appVersion}}/{{os}}/{{architecture}}
https://dod.teams.microsoft.us     https://dod.teams.microsoft.us/desktopclient/update/{{appVersion}}/{{os}}/{{architecture}}
https://teams.microsoft.scloud     https://teams.microsoft.scloud/desktopclient/update/{{appVersion}}/{{os}}/{{architecture}}
https://teams.eaglex.ic.gov        https://teams.eaglex.ic.gov/desktopclient/update/{{appVersion}}/{{os}}/{{architecture}}"
https://teams.microsoftonline.cn   https://teams.microsoftonline.cn/desktopclient/update{{appVersion}}/{{os}}/{{architecture}}
https://teams.live.com             https://teams.live.com/desktopclient/update/{{appVersion}}/{{os}}/{{architecture}}

Der klassische "Office365/Microsoft 365"-Tenant nutzt nur die erste Zeile.

Update-Check

Die ganz Kommunikation außer Audio/Video/Desktopsharing von Microsoft Teams erfolgt über HTTPS und kann daher über einen Inspection Proxy wie Fiddler einfach eingesehen werden. Der erste Aufruf ist die Suche nach Updates mit dem aktuell angemeldeten Benutzer. Dazu spricht der Client eine URL an, die seine eigene Versionsnummer enthält. Für die Windows-Version können Sie die aktuelle Version per PowerShell auch anonym ermitteln, wobei dann natürlich keine Berücksichtigung von TAP/BETA o.a. Clients möglich ist, die in der Regel einige Versionen "höher" sind.

PS C:\> Invoke-RestMethod https://teams.microsoft.com/desktopclient/update/1.3.00.24154/windows/x64

isUpdateAvailable : True
nugetPackagePath : https://statics.teams.cdn.office.net/production-windows/1.5.00.33362/Teams-1.5.00.33362-full.nupkg
releasesPath : https://statics.teams.cdn.office.net/production-windows/1.5.00.33362/RELEASES
url :
scenarioCode : 1
deltaPackagePath : https://statics.teams.cdn.office.net/production-windows/1.5.00.33362/deltas/1.3.00.24154/Teams-1.5.00.33362-delta.nupkg
deltaReleasesPath : https://statics.teams.cdn.office.net/production-windows/1.5.00.33362/deltas/1.3.00.24154/RELEASES

Auf einem PC mit entsprechend angemeldeten Benutzer habe ich dann eine neuere Version bekommen. Mit einer anonymen Anfrage aber nicht. Microsoft wertet hier wohl durchaus noch eine Authentifizierung, Cookie o.ä. aus.

Wenn Sie genau mit der aktuellen oder einer höheren Versionsnummer zugreifen, dann liefert der Service einen leere Antwort.
Ich hätte zumindest eine JSON-Antwort mit einem "isUpdateAvailable: False" erwartet, um die Gültigkeit der Antwort zu prüfen.

Der Abruf erfolgte zu einer Zeit, als aufgrund des Fehlers in Sonderzeichen in Userprofile die aktuelles Version 1.5.00.34154/1.5.00.34874 zurückgezogen wurde und nur noch die 1.5.00.33362 angeboten wurde.
Ich interpretiere das aber auf den ersten Blick so, dass es anscheinend keine "Downgrade"-Funktion gibt, mit der Microsoft ein Update zurückziehen kann. Nur ein Aussetzen der Updates ist möglich

Die Pfade verweisen direkt auf die DownloadQuellen, die dann vom Client heruntergeladen werden. Auch diese URL kann per PowerShell direkt anonym angesprochen werden.

PS C:\> (Invoke-WebRequest https://statics.teams.cdn.office.net/production-windows/1.5.00.33362/Teams-1.5.00.33362-full.nupkg -Method head).headers

Key Value
--- -----
Accept-Ranges {bytes}
ETag {"0x8DAD24DB7BEC8F6"}
Server {Windows-Azure-Blob/1.0, Microsoft-HTTPAPI/2.0}
X-Cache {TCP_HIT}
x-ms-request-id {5b1f4bbf-401e-0007-1517-12128d000000}
x-ms-version {2014-02-14}
x-ms-lease-status {unlocked}
x-ms-lease-state {available}
x-ms-blob-type {BlockBlob}
Access-Control-Expose-Headers {x-ms-request-id,Server,x-ms-version,Content-Type,Content-Encoding,Content-Language,Cach…
Access-Control-Allow-Origin {*}
X-Azure-Ref-OriginShield {Ref A: 9ECC1A3FA16349828B2373DCDE32B9C7 Ref B: AM3EDGE0910 Ref C: 2022-12-19T15:53:17Z}
NEL {{"report_to":"NelMSTeams","max_age":604800,"failure_fraction":0.2,"success_fraction":0.…
Report-To {{"group":"NelMSTeams","max_age":604800,"endpoints":[{"url":"https://teams.nel.measure.o…
X-MSEdge-Ref {Ref A: D349D93CB1E44D3BAFE7538D50C8476E Ref B: FRA31EDGE0619 Ref C: 2022-12-21T22:01:39…
Date {Wed, 21 Dec 2022 22:01:38 GMT}
Content-Length {130050343}
Content-Type {application/zip}
Last-Modified {Tue, 29 Nov 2022 21:07:26 GMT}
Content-Disposition {}

PS C:\> (Invoke-WebRequest https://statics.teams.cdn.office.net/production-windows/1.5.00.33362/Teams-1.5.00.33362-full.nupkg -outfile Teams_windows_x64.1.5.00.33362

Die Daten liegen anscheinend in einem Azure Blob-Storage. Mit der Versionsnummer des aktuellen Clients können Sie auch direkt die Installer.EXE herunterladen. Die Datei kommt dann von einem Content Delivery Netzwerk.

https://statics.teams.cdn.office.net/production-windows-x64/Y.Y.Y.Y/Teams_windows_x64.exe
https://statics.teams.cdn.office.net/production-windows-x64/1.5.00.34154/Teams_windows_x64.exe
https://statics.teams.cdn.office.net/production-windows-x64/1.5.00.31168/Teams_windows_x64.exe
https://statics.teams.cdn.office.net/production-windows-x64/1.5.00.35066/Teams_windows_x64.exe

u.a.

Auch hier gilt wieder, dass die Versionsnummer komplett passen muss. Eine falsche Version liefert einen Fehler "BlobNotFoundThe specified blob does not exist"

Wenn Sie die Versionsnummer älterer Teams-Versionen kennen, können Sie diese auch herunterladen. Die Teams Release Notes sind eine Quelle einiger älterer Versionen.

Am 21. Dezember 2022 konnte ich z.B. immer noch die Version 1.5.00.9163 vom April 2022 herunterladen. Die Installation einer solch alten Version macht natürlich selten Sinn, denn meist triggert eine zu alte Version direkt ein Update oder das Format der Daten im Cache verhindert eine Anmeldung. Bei mir hat nach der Anmeldung der Teams Client umgehend ein Update gestartet, das sich dann aber totgelaufen hat. Ich habe nicht weiter geforscht und einfach das Teams-Verzeichnis gelöscht und frisch die aktuell gültige Version installiert. Fehler konnte ich im Squirrellog nicht finden. Vermutlich war es schon überschrieben worden.

Die NUPKG-Datei ist übrigens ein verkapptes ZIP-File. Wenn Sie die Erweiterung auf ".zip" ändern, können Sie reinschauen. Die Datei "Teams.nuspec" enthält z.B. die Version und auch die Verzeichnisstruktur kommt sehr bekannt vor.

Update durch Squirrel

Nicht nur der Teams Client nutzt viele Open Source Projekte sondern auch das Updates erfolgt anscheinend über Squirrel und das Verzeichnis "%localappdata%\Microsoft\Teams\packages" spielt eine wichtige Rolle:

Hier finden sich nicht nur das "Packages"-Verzeichnis, in dem die heruntergeladenen Pakete landen sondern daneben finden wir noch ein "current" und ein "previous"-Verzeichnis. Während des Updates können Sie auch noch ein "Stage" und manchmal ein "current-s1"-Verzeichnis sehen. Die Verknüpfungen zu Teams verweisen auf die Update.exe mit folgenden Parametern:

C:\\AppData\Local\Microsoft\Teams\Update.exe --processStart "Teams.exe"

Die kleine "Update.Exe" scheint so etwas wie der Bootloader zu sein, welcher dann erst Teams startet. In den 2 Megabyte finden sich Strings wie "GetPESquirrelAwareVersion", die ganz klar auf das Projekt "https://github.com/Squirrel/Squirrel.Windows/" verweisen. Etwas irritierend finde ich, dass im Dez 2022 immer noch die Version 2.0.1 vom Sep 2020 aktuell ist. Entweder ist das Projekt "ausentwickelt", wogegen aber die Issues sprechen oder es ist etwas vernachlässigt.

Auszug aus %localappdata%\microsoft\teams\SquirrelSetup.log

Program: Starting Squirrel Updater: --createShortcut=Teams.exe -l=StartMenu
Program: Starting Squirrel Updater: --update C:\\AppData\Roaming\Microsoft\Teams\DownloadedUpdate
Program: Starting update, downloading from C:\\AppData\Roaming\Microsoft\Teams\DownloadedUpdate
Program: About to update to: C:\\AppData\Local\Microsoft\Teams
CheckForUpdateImpl: Generated new staging user ID: 69d9b5c0-25e5-5c96-b5d8-c75df5f5be7c
CheckForUpdateImpl: Reading RELEASES file from C:\\AppData\Roaming\Microsoft\Teams\DownloadedUpdate
ApplyReleasesImpl: Applying delta packages to current full package
DeltaPackageBuilder: Applying MSDiff to lib\net45\api-ms-win-core-console-l1-1-0.dll.diff
DeltaPackageBuilder: Applying MSDiff to lib\net45\api-ms-win-core-console-l1-2-0.dll.diff
...
DeltaPackageBuilder: Updating metadata file: Teams.nuspec
DeltaPackageBuilder: Repacking into full package: C:\\AppData\Local\Microsoft\Teams\packages\Teams-1.5.00.34154.nupkg
ApplyReleasesImpl: Writing files to app directory: C:\\AppData\Local\Microsoft\Teams\stage
ApplyReleasesImpl: Squirrel Enabled Apps: [C:\\AppData\Local\Microsoft\Teams\stage\Teams.exe]
ApplyReleasesImpl: About to RemoveOldShorcuts for Teams.exe, rootAppDir C:\\AppData\Local\Microsoft\Teams
ApplyReleasesImpl: Starting fixPinnedExecutables
ApplyReleasesImpl: Processing shortcut 'C:\\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar\Microsoft Teams (work or school).lnk'
ApplyReleasesImpl: Old shortcut target: 'C:\\AppData\Local\Microsoft\Teams\Update.exe'
ApplyReleasesImpl: New shortcut target: 'C:\\AppData\Local\Microsoft\Teams\Update.exe'
ApplyReleasesImpl: Fixing up tray icons
MeetingAddinInstaller: There is no version.txt. Falling back to getting version from folder name
MeetingAddinInstaller: Version: 1.0.22321.3; addinPackageDirectory: 1.0.22321.3
MeetingAddinInstaller: .dead exists: False
MeetingAddinInstaller: path to .dead: C:\\AppData\Local\Microsoft\TeamsMeetingAddin\1.0.22321.3\.dead
MeetingAddinInstaller: before cleanup unused versions
MeetingAddinInstaller: Addin directory exists. Copy was successful
MeetingAddinInstaller: Version 1.0.22304.2 of the meeting add-in is now installed
PresenceAddinInstaller: Installing Teams Presence addin for Outlook...
PresenceAddinInstaller: check if UC TypeLib points to current\resources\assets\tlb\Uc.tlb
PresenceAddinInstaller: UC Typelib WIN32 is registered under HKCU and file exists. Registration not needed!
PresenceAddinInstaller: UC Typelib WIN64 is registered under HKCU and file exists. Registration not needed!
PresenceAddinInstaller: IM Provider registry key already exists!
ApplyReleasesImpl: cleanDeadVersions: for original version of 1.5.00.33362 and current version of 1.5.00.34154
ApplyReleasesImpl: cleanDeadVersions: exclude original folder stage
ApplyReleasesImpl: cleanDeadVersions: exclude current folder stage
Program: Starting Squirrel Updater: --quitAndInstall Teams.exe
Program: Registry value Software\Policies\Microsoft\Office\16.0\Teams\PreventFirstLaunchAfterInstall does not exist
RegistryService: RegKeyExists: HKEY_CURRENT_USER\Software\Microsoft\Office\Teams does not have DeadEndV3
Program: Registry value Software\Microsoft\Office\Teams\DeadEndV3 does not exist. Return default value: false
Program: About to launch: 'C:\\AppData\Local\Microsoft\Teams\current\Teams.exe': --system-initiated

Das sind nur ein paar Zeilen, aber sie sehen recht gut, wie Squirrel hier arbeitet. Es prüft und aktualisiert LNK-Dateien, aktualisiert die Quelle anhand von DIFF-Dateien und beseitigt am Ende die älteren Versionen. In dem Logs erscheinen übrigens auch temporäre Verzeichnisse, die auf dem PC nach dem Update nicht mehr zu finden sind, wie z.B. ein "stage"-Verzeichnis, in dem Squirrel die neue Version zusammenbaur, ehe daraus dann die neue "current" wird.

Im Grund ist der Update-Prozess ziemlich gut ausgereift, da eine kleine Update.exe vor das Hauptprogramm geschaltet ist, die eine Versionsprüfung und Zwangsupdate machen kann. Ich habe nun aber noch nicht weiter untersucht, ob Squirrel auch defekte Installationen erkennen kann. Anscheinend prüft eine ":DEAD"-Datei, mit der man vielleicht eine defekte Installation deaktivieren kann. Übrigens können Sie "update.exe" auch direkt aufrufen. Sie sehen dann aber nur eine CMD-Shell mit den möglichen Optionen.

Squirrel schreibt verschiedene Log-Files aber manchmal ist sich der Prozess wohl nicht sicher, wo der beste Platz ist. Ich habe Squirrel-Logs an vielen Stellen gefunden:

%localappdata%\Microsoft\Teams\SquirrelSetup.log
%localappdata%\Microsoft\Teams\current\SquirrelSetup.log
%localappdata%\SquirrelTemp\Squirrel-Install.log
%localappdata%\SquirrelTemp\SquirrelSetup.log
%appdata%\Microsoft\Teams\SquirrelTelemetry.log
%appdata%\Microsoft\Teams\installTime.txt

Besonders hilfreich fand ich dabei die Datei "%Appdata%\\Microsoft\Teams\SquirrelSetup.log", da ich mir das ein oder andere Mal die Konfiguration so zerstört habe, dass Teams gar nicht mehr starten konnte.

Auszug aus %Appdata%\\Microsoft\Teams\SquirrelSetup.log"

2022-12-22 14:22:40> Program: Starting Squirrel Updater: --processStart Teams.exe --process-start-args --profile=AAD
2022-12-22 14:22:40> RegistryService: TryGetRegKey: HKEY_CURRENT_USER\Software\Microsoft\Office\Teams\AcquireSource does not exist
2022-12-22 14:22:40> Unhandled exception: System.IO.FileNotFoundException: Die Datei "C:\\AppData\Local\Microsoft\Teams\packages\RELEASES" konnte nicht gefunden werden.

Insbesondere das Fehlen der "RELEASES"-Datei scheint update.exe nicht reparieren zu können, in der die Versionen beschrieben sind.

Update Prozess im Detail

Ich habe mir die Mühe gemacht, mit Procmon auf meine PC den Update-Prozess genauer zu analysieren und habe von Version 1.4.00.29473 (April 2022) auf 1.5.00.33362l aktualisiert. In dem Zuge habe ich kurz für dem Schreiben des aktuellen NUPKG-Pakets einen Zugriff auf ein Logfile gefunden, welches ich vorher nicht gesehen habe. Es protokolliert schön die Updates. Zur Lesbarkeit habe ich die Zeitstempel und ProcessID entfernt:

Auszug aus %APPDATA%\Microsoft\Teams\logs.txt

-- info -- Checking for updates, User invoked - true, Download immediate - false, Forced version - null 
-- info -- Checking for update from /desktopclient/update/1.4.00.29473/windows/x64?ring=general 
-- info -- Downloading file from - https://teams.microsoft.com/desktopclient/update/ 
-- info -- Browser Window HTTP: Get Data HTTP with url:https://teams.microsoft.com/desktopclient/update/1.4.00.29473/windows/x64?ring=general 
-- info -- Browser Window HTTP: Push url in request queue:https://teams.microsoft.com/desktopclient/update/1.4.00.29473/windows/x64?ring=general 
-- info -- Browser Window HTTP: Download URL:https://teams.microsoft.com/desktopclient/update/1.4.00.29473/windows/x64?ring=general 
-- info -- UpdateResponse: {"isUpdateAvailable":true,
                            "nugetPackagePath":"https://statics.teams.cdn.office.net/production-windows-x64/1.5.00.33362/Teams-1.5.00.33362-full.nupkg",
                            "releasesPath":"https://statics.teams.cdn.office.net/production-windows-x64/1.5.00.33362/RELEASES",
                            "url":null,"scenarioCode":2,
                            "deltaPackagePath":"https://statics.teams.cdn.office.net/production-windows-x64/1.5.00.33362/deltas/1.4.00.29473/Teams-1.5.00.33362-delta.nupkg",
                            "deltaReleasesPath":"https://statics.teams.cdn.office.net/production-windows-x64/1.5.00.33362/deltas/1.4.00.29473/RELEASES"} 546 
-- info -- User invoked, download immediately 
-- info -- Downloading updates 
-- info -- Browser Window HTTP: Get Data HTTP with url:https://statics.teams.cdn.office.net/production-windows-x64/1.5.00.33362/Teams-1.5.00.33362-full.nupkg 
-- info -- Browser Window HTTP: Push url in request queue:https://statics.teams.cdn.office.net/production-windows-x64/1.5.00.33362/Teams-1.5.00.33362-full.nupkg 
-- info -- Browser Window HTTP: Download URL:https://statics.teams.cdn.office.net/production-windows-x64/1.5.00.33362/Teams-1.5.00.33362-full.nupkg 
-- info -- Downloading Browser Window HTTP:Teams-1.5.00.33362-full.nupkg 
-- info -- Browser Window HTTP: Resolving. Download completed for:Teams-1.5.00.33362-full.nupkg 
-- info -- Downloading file from - https:// 
-- info -- Browser Window HTTP: Get Data HTTP with url:https://statics.teams.cdn.office.net/production-windows-x64/1.5.00.33362/RELEASES 
-- info -- Browser Window HTTP: Push url in request queue:https://statics.teams.cdn.office.net/production-windows-x64/1.5.00.33362/RELEASES 
-- info -- Browser Window HTTP: Download URL:https://statics.teams.cdn.office.net/production-windows-x64/1.5.00.33362/RELEASES 
-- info -- Downloading Browser Window HTTP:RELEASES.txt 
-- info -- Browser Window HTTP: Resolving. Download completed for:RELEASES.txt 
-- info -- Executing squirrel command: --update 
-- info -- Update successful 
-- info -- The writeInstallOrUpdateTime passed 
-- info -- Updated completed. Ready to restart. 
-- info -- Stopping daemon App updates 
-- info -- Restarting the app 
-- info -- Updating done and restarting to updated app Teams

Das ist aber nur das "Teams Log, welches nicht verrät, was genau im Hintergrund beim Update passiert. Mit den Zeitstempeln konnte ich dann aber wieder in Procmon die nächsten Schritte analysieren.

  • Suche in "C:\\AppData\Roaming\Microsoft\Teams\DownloadedUpdate\*"
    Das Verzeichnis hatte er am Start angelegt und wieder gelöscht.
  • Der eigentliche Download des Update in ein TMP-Verzeichnis, welches später nicht mehr da ist.
  • Wechsel auf "update.exe"
    Nachdem Teams das update heruntergeladen und bereitgestellt hat, wird Teams beendet und C:\\AppData\Local\Microsoft\Teams\Update.exe gestartet, welches sich scheinbar erst mal selbst überwacht.
  • Auspacken des NUPKG nach "stage"
  • Squirrel startet
    Nachdem Update.exe fertig ist, startet er Squirrel aus dem Stage-Verzeichnis
  • Teams startet aus "Stage"
    Squirrel.exe und update.exe sind immer noch aktiv, als eine neue teams.exe aus dem Stage-Verzeichnis startet
  • Meeting Addon
    Zwischenzeitlich wird auch noch mal regevr32.exe gestartet, um das Meeting-Addin zu registrieren, welches ganz wo anders liegt
  • Rename-Operation
    Allerdings hatte ich mir erhofft dass ich auch die Aktivierung der neuen Version einfacher finde. Ich musste erst in einem anderen Trace ein Verzeichnis umbenennen, um den Event "SetRenameInformationFile" zu finden, mit dem ich dann meinen Teams Update Trace in Procmon filtern konnte:

In den Details steht dann auch die Quelle drin, woraus ich folgenden Prozess ableite

C:\\AppData\Local\Microsoft\Teams\current    -> C:\\AppData\Local\Microsoft\Teams\current-s1
C:\\AppData\Local\Microsoft\Teams\stage      -> C:\\AppData\Local\Microsoft\Teams\current
C:\\AppData\Local\Microsoft\Teams\current-s1 -> C:\\AppData\Local\Microsoft\Teams\previous

Das ist ein klassischer Ringtausch, bei dem das Current-Verzeichnis erst einmal als "current-s1" gesichert wird, ehe dann "stage" zu "current" wird, ehe dann das bisherige "previous" durch das temporäre "current-1" ersetzt wird.

Automatisches Rollback

Auch bei Microsoft kann ja mal etwas schief gehen. Da stellt sich die Frage nach einem "Rollback". Durch einen Case bei einem Kunden habe ich erfahren, dass es wohl eine Rollback-Option gibt. Wie genau diese aber funktioniert, konnte ich nicht mittracken. Ich habe nur in den Logs Hinweise auf diese Funktion gesehen, z.B. in:

Auszug aus %APPDATA%\Microsoft\Teams\logs.txt

-- event -- eventpdclevel: 3, distSrc: default, source: exe,
                              type: notManagedDeployed,
                              launchPath: %LOCALAPPDATA%,
                              isUserInvoked: true,
                              isLoggedOut: false, bucketId: 6,
                              regularJitter: 3632479,
                              hotfixJitter: 1816245,
                              staggeredV2: true,
                              policy: false,
                              correlationId: 3ffd277b-a89e-4945-bc1b-acde73e50b34,
                              endpointSource: pds, route: https://statics.teams.cdn.office.net/production-windows-x64/1.5.00.33362/RELEASES,
                              scenarioCode: 2,
                              newAppVersion: 1.5.00.33362,
                              isDowngrade: false,
                              updateStatusReason: undefined,
                              distribution: FULL,
                              sizeInBytes: 137461385,
                              signedUpdates: ignore,
                              count: null,
                              status: success,
                              scenario: 771ef2b5-7c62-4b42-b4b2-682b3371bdbc,
                              scenarioName: desktop_update_download,
                              name: desktop_update_download,
                              step: stop, sequence: 1, delta: 7814, scenarioDelta: 7814, elapsed: 68607, stepDelta: 7814, Scenario.Mode: 1,
                              AppInfo.Language: de-de, complianceEnvironmentType: 0, isDataCategorizationEnabled: true, userpdclevel: 0,
                              processMemory: 20747028, freeMemory: 8060956672, clientType: desktop,
                              AppInfo.ClientType: desktop, batterylevel: 0.89, pluggedin: true,
                              Window.Focus: foreground, windowIsVisible: true, Window.Status: maximized,
                              UserInfo.TimeZone: +01:00, vdiMode: 0,
                              Scenario.Name: desktop_update_download,
                              Scenario.Step: stop, Scenario.Status: success

Hier gibt es etwa in der Mitte die Kennzeichnung "isDowngrade: false". Auf der anderen Seite gibt es die Aussagen zu Squirrel:

... you must increment the version number higher than your broken release (in this example, we would need to release MyApp 1.0.2). Because some of your users will be on the broken 1.0.1, releasing a new 1.0.1 would result in them staying on a broken version.
https://github.com/Squirrel/Squirrel.Windows/blob/develop/docs/using/staged-rollouts.md

Currently, there is no built-in support for rolling back to a previous version.
https://github.com/Squirrel/Squirrel.Windows/blob/develop/docs/using/update-process.md#rollback

Wenn Microsoft wirklich die Squirrel-Engine nutzt, dann haben Sie entweder etwas "drumrum" gebaut oder ihre Funktionserweiterungen noch nicht in das öffentliche Repository eingecheckt. Ich habe mir über 1k Forks nun nicht angeschaut, ob darunter auch der Microsoft Teams Zweig ist.

ManuelleRollback

Aber mit dem Wissen um die Updates und die Bereitstellung durch Microsoft können Sie manuell ein Rollback als Benutzer machen. Dazu gibt es drei  Optionen:

Debug Menü

Wenn Sie bei einem laufenden Teams das kleine Icon in der Fußzeile neben der Uhr sieben mal mit der linken Maustaste klicken und dann die rechte Maustaste klicken, sehen Sie in den vielen neuen Einträgen eine Rollback-Option:

Ich könnte mir vorstellen, dass es auch für "update.exe" oder "teams.exe" einen Kommandozeilen-Parameter gibt.

Previous-Verzeichnis

Wenn Sie im "%localappdata%\Microsoft\Teams\" noch ein Verzeichnis "Previous" haben, dann können Sie einfache folgendes machen:

  • Teams Client und Outlook Client beenden
    Damit keine Dateien und auch das Meeting-Plugin frei sind
  • Verzeichnis "Current" z.B. nach "current.alt" umbenennen
    Sie können es auch gleich löschen aber das kann man später immer noch passieren. Teams löscht überzählige Verzeichnisse hier nicht.
  • Verzeichnis "Previous" zu Current kopieren oder umbenennen
  • Teams starten

Es reicht übrigens nicht, einfach zu löschen. "Update.exe" hat scheinbar keinen Recovery-Mode, um bei einem fehlenden "Current"-Verzeichnis einfach das "Previous"-Verzeichnis live zu schalten.

Neuinstallation

Die zweite Version ist einfach eine komplette Teams Neuinstallation mit einer älteren Teams-Installer.exe, die Sie nach dem folgenden Verfahren noch erhalten können:

  • Gewünschte Build-Nummer ermitteln
    Entweder Sie kennen einen Client mit der gewünschten Version und lassen sich über die "Info - Version" die Nummer anzeigen oder schauen in die Datei "%localappdata%\Microsoft\Teams\packages\RELEASES." oder in die Release Notes auf https://learn.microsoft.com/de-de/officeupdates/teams-app-versioning
  • Download der Installationsquelle
    Über die schon bekannte URL https://statics.teams.cdn.office.net/production-windows-x64/Y.Y.Y.Y/Teams_windows_x64.exe können Sie dann die Vollinstallation herunterladen. Ersetzen Sie dabei Y.Y.Y.Y durch die gewünschte und verfügbare Version. Wobei scheinbar nicht alle Versionen immer zum Download stehen.
  • Alte Teams-Installation löschen
    Bei einer Installation über eine bestehende neuere Version wird kein Downgrade gemacht. Daher löschen wir einfach die Teams-Programmdateien auf "%localappdata%\Microsoft\Teams\". Eventuell müssen Sie Outlook beenden, wenn das Meeting-Plugin noch installiert ist oder sie überspringen den Fehler.
  • Teams Setup starten
    Nun können sie die heruntergeladene "Teams_windows_x64.exe" als Benutzer starten.

Sollte nach dem Update Teams starten aber die Anmeldung verweigern, dann könnte es an dem Teams Cache liegen, der eventuell zu aktuell ist. Der einfaches Weg ist dann die angebotene Funktion zur "Abmeldung" zu nutzen. Das löscht Daten zum Profil und erlaubt ihnen eine saubere Neuanmeldung.

Durch meine Experimente habe ich mir das ein oder andere Mal den Teams Client derart zerschossen, dass er gar nicht mehr starten wollte. Dann hat die Neuinstallation immer wieder geholfen.

Weitere Links