Einleitung
Im vorherigen Teil unserer Winget-Serie haben wir gezeigt, wie Programme gesucht und installiert werden. Sobald ein Windows-System jedoch einige Monate oder Jahre betrieben wird, entsteht die nächste Herausforderung: Software muss regelmäßig aktualisiert werden.
Browser, Entwicklungswerkzeuge, Multimedia-Programme, Administrationswerkzeuge und viele weitere Anwendungen erhalten kontinuierlich Updates. Diese beheben nicht nur Fehler, sondern schließen häufig auch Sicherheitslücken.
Traditionell bedeutet das unter Windows:
- Anwendung starten
- Nach Updates suchen
- Hersteller-Webseite besuchen
- Installer herunterladen
- Update installieren
- Anwendung neu starten
Mit Winget lässt sich dieser Prozess erheblich vereinfachen.
Der zentrale Befehl lautet:
winget upgrade
Der Alias
winget update
führt zum gleichen Befehl. Microsoft dokumentiert update ausdrücklich als Alias von upgrade.
Verfügbare Updates anzeigen
Bevor Programme aktualisiert werden, empfiehlt es sich zunächst zu prüfen, welche Updates verfügbar sind.
Dazu genügt:
winget upgrade
Winget durchsucht die installierten Anwendungen, gleicht deren Versionen mit den verfügbaren Paketen aus den eingerichteten Sources ab und zeigt anschließend aktualisierbare Anwendungen an. Microsoft empfiehlt ausdrücklich, winget upgrade ohne weitere Parameter zunächst als Vorschau zu verwenden, bevor --all eingesetzt wird.
Eine typische Ausgabe kann beispielsweise folgendermaßen aussehen:
Name ID Version Verfügbar ---------------------------------------------------------------------------- Mozilla Firefox Mozilla.Firefox 143.0 144.0 PowerToys Microsoft.PowerToys 0.93.0 0.94.0 Visual Studio Code Microsoft.VisualStudioCode 1.103.0 1.104.0
Damit lässt sich schnell erkennen, welche Anwendungen aktualisiert werden können.
Einzelnes Programm aktualisieren
Nicht immer sollen sämtliche verfügbaren Updates installiert werden.
Eine einzelne Anwendung kann beispielsweise über ihren Namen aktualisiert werden:
winget upgrade Firefox
Besser ist wiederum die eindeutige Paket-ID:
winget upgrade --id Mozilla.Firefox
Für Skripte empfiehlt sich zusätzlich:
winget upgrade --id Mozilla.Firefox --exact
Dadurch wird das gewünschte Paket eindeutig identifiziert.
Microsoft weist darauf hin, dass der Upgrade-Befehl eine eindeutige Zuordnung benötigt. Bei Mehrdeutigkeiten fordert Winget eine weitere Eingrenzung an.
Mehrere Programme gezielt aktualisieren
Aktuelle Winget-Versionen unterstützen auch mehrere Pakete innerhalb eines Upgrade-Aufrufs.
Beispielsweise:
winget upgrade Microsoft.PowerToys Microsoft.VisualStudioCode Git.Git
Damit können mehrere ausgewählte Anwendungen nacheinander aktualisiert werden. Microsoft führt diese Mehrfachverarbeitung inzwischen auch in der offiziellen Dokumentation auf.
Das ist praktisch, wenn beispielsweise nur eine bestimmte Gruppe administrativer Werkzeuge aktualisiert werden soll.
Alle Programme aktualisieren
Die bekannteste Upgrade-Funktion von Winget lautet:
winget upgrade --all
Alternativ steht der Alias
winget upgrade -r
beziehungsweise --recurse zur Verfügung.
Winget sucht damit nach allen installierten Paketen, für die ein verfügbares Upgrade erkannt wird, und versucht diese zu aktualisieren.
Für einen privaten Rechner kann das bereits genügen.
In administrierten Umgebungen empfiehlt sich jedoch zunächst:
winget upgrade
und erst nach Prüfung:
winget upgrade --all
So lassen sich unerwünschte Versionssprünge erkennen, bevor sie automatisch installiert werden.
Silent-Updates
Wie bei Installationen lässt sich auch beim Upgrade die Benutzeroberfläche vieler Installer unterdrücken.
Beispiel:
winget upgrade --id Mozilla.Firefox --exact --silent
Für alle verfügbaren Pakete:
winget upgrade --all --silent
Das ist besonders für automatisierte Abläufe interessant.
Zusätzlich können Paket- und Quellenvereinbarungen akzeptiert werden:
winget upgrade --all --silent ` --accept-package-agreements ` --accept-source-agreements
Für vollständig unbeaufsichtigte Abläufe kann außerdem
--disable-interactivity
verwendet werden.
Beispiel:
winget upgrade --all ` --silent ` --accept-package-agreements ` --accept-source-agreements ` --disable-interactivity
Wichtig bleibt: Nicht jeder Drittanbieter-Installer verhält sich identisch. Ein automatisierter Update-Prozess sollte deshalb vor dem produktiven Einsatz getestet werden.
Programme von Updates ausschließen
Eine der wichtigsten Funktionen für Administratoren ist die Möglichkeit, bestimmte Programme nicht automatisch zu aktualisieren.
Winget verwendet dafür sogenannte Pins.
Beispiel:
winget pin add --id Microsoft.PowerToys
Ein normaler Pin sorgt dafür, dass das Paket bei
winget upgrade --all
übersprungen wird.
Eine direkte Aktualisierung des Programms bleibt jedoch möglich:
winget upgrade --id Microsoft.PowerToys
Microsoft unterscheidet bei Winget aktuell drei Pin-Typen: normales Pinning, Blocking und Gating.
Vorhandene Pins anzeigen
Alle gesetzten Pins können angezeigt werden:
winget pin list
Damit lässt sich schnell überprüfen, welche Anwendungen aktuell von automatischen Updates ausgeschlossen oder auf bestimmte Versionen begrenzt werden.
Einen Pin entfernen
Soll ein Paket wieder normal aktualisiert werden, wird der Pin entfernt:
winget pin remove --id Microsoft.PowerToys
Anschließend wird das Paket wieder von normalen Upgrade-Vorgängen berücksichtigt.
Updates vollständig blockieren
Ein stärkerer Ausschluss erfolgt über einen Blocking-Pin:
winget pin add --id Microsoft.PowerToys --blocking
Ein solcher Pin blockiert sowohl
winget upgrade --all
als auch ein direktes:
winget upgrade --id Microsoft.PowerToys
Microsoft dokumentiert Blocking ausdrücklich als strengere Pin-Variante.
Das ist beispielsweise sinnvoll, wenn eine bestimmte Anwendung aufgrund von Kompatibilitätsproblemen keinesfalls aktualisiert werden darf.
Updates auf einen Versionsbereich begrenzen
Noch interessanter ist das sogenannte Gating.
Damit kann eine Anwendung nur innerhalb eines bestimmten Versionsbereichs aktualisiert werden.
Beispiel:
winget pin add --id Microsoft.PowerToys --version 0.94.*
Damit wären beispielsweise Versionen innerhalb der 0.94-Reihe zulässig, ein Sprung auf eine spätere Haupt- oder Nebenreihe jedoch nicht.
Winget verwendet dabei * als Platzhalter im letzten Versionsteil.
Das eignet sich hervorragend für kontrollierte Softwarefreigaben.
Beispiel einer betrieblichen Versionsfreigabe
Angenommen, eine Organisation hat folgende Vorgabe:
Anwendung: Beispielsoftware Freigegebene Version: 8.4.x Neue Version verfügbar: 9.0
Dann könnte ein Versions-Pin verhindern, dass die Anwendung bereits auf Version 9 aktualisiert wird:
winget pin add --id Hersteller.Beispielsoftware --version 8.4.*
Die IT-Abteilung kann Version 9 zunächst testen.
Erst nach Freigabe wird der Pin entfernt oder entsprechend angepasst.
Damit kann Winget Teil eines strukturierten Patch- und Freigabeverfahrens werden.
Gepinnte Pakete bewusst einschließen
Nicht blockierende Pins können bei Bedarf mit:
winget upgrade --all --include-pinned
einbezogen werden.
Microsoft weist darauf hin, dass dies nur für nicht blockierende Pins gilt.
Das sollte daher bewusst und nicht pauschal in jedem automatisierten Update-Skript verwendet werden.
Eine bestimmte Version installieren
Winget kann beim Upgrade auch gezielt eine Version auswählen.
Beispiel:
winget upgrade --id Microsoft.PowerToys --version <Version>
Ohne --version versucht Winget grundsätzlich, auf die höchste verfügbare passende Version zu aktualisieren.
Das ist beispielsweise bei Softwarefreigaben hilfreich.
Ein möglicher administrativer Ablauf:
Neue Version erscheint
↓
Testsystem aktualisieren
↓
Funktionstest
↓
Freigabe
↓
Produktionssysteme aktualisieren
Anwendungen mit unbekannter Version
Nicht jede installierte Windows-Anwendung meldet ihre Versionsnummer korrekt.
Winget kann dann möglicherweise nicht feststellen, ob ein Upgrade erforderlich ist.
Solche Anwendungen lassen sich mit:
winget upgrade --all --include-unknown
beziehungsweise:
winget upgrade --all -u
einbeziehen.
Microsoft weist ausdrücklich darauf hin, dass Programme ohne erkennbare lokale Version standardmäßig nicht automatisch aktualisiert werden können und dafür --include-unknown erforderlich ist.
Diese Option sollte mit Bedacht eingesetzt werden, weil Winget in diesem Fall eben nicht zuverlässig vergleichen kann, ob die vorhandene Version älter als die angebotene Version ist.
Vorherige Version deinstallieren
Einige Installer aktualisieren eine vorhandene Installation direkt.
Andere installieren neue Versionen möglicherweise parallel.
Winget bietet dafür:
--uninstall-previous
Beispiel:
winget upgrade --id Hersteller.Anwendung --uninstall-previous
Damit wird Winget angewiesen, die vorherige Version im Rahmen des Upgrades zu deinstallieren.
Das konkrete Verhalten hängt allerdings weiterhin vom jeweiligen Paket und Installer ab. Manche Manifeste definieren dieses Verhalten bereits selbst.
Diese Option sollte deshalb immer zuerst mit der betreffenden Anwendung getestet werden.
Neustarts nach Updates
Softwareupdates können einen Neustart erfordern.
Standardmäßig sollte ein automatisierter Winget-Updateprozess nicht einfach ungeplant einen produktiven Rechner neu starten.
Winget stellt dafür die Option:
--allow-reboot
bereit. Sie erlaubt einen Neustart, wenn dieser im Rahmen des Upgrades erforderlich ist.
Beispiel:
winget upgrade --all --allow-reboot
In administrierten Umgebungen sollte dieser Parameter jedoch mit großer Vorsicht eingesetzt werden.
Auf Arbeitsplatzrechnern könnten dadurch:
- nicht gespeicherte Dokumente verloren gehen
- Benutzer bei laufender Arbeit unterbrochen werden
- Anwendungen unerwartet geschlossen werden
- VPN-Verbindungen getrennt werden
- Batch-Prozesse abgebrochen werden
Besser ist meist, Updates in definierten Wartungsfenstern durchzuführen und Neustarts separat zu steuern.
Winget plant Updates nicht selbst
Ein wichtiger Punkt:
Winget besitzt keinen eigenen integrierten Zeitplaner für regelmäßige Updates.
Für geplante Aktualisierungen kann jedoch die Windows-Aufgabenplanung verwendet werden.
Damit lässt sich Winget beispielsweise:
- täglich
- wöchentlich
- beim Systemstart
- bei Benutzeranmeldung
- innerhalb eines Wartungsfensters
ausführen.
Einfaches PowerShell-Skript für automatische Updates
Ein einfaches Skript könnte folgendermaßen aussehen:
winget source update
winget upgrade --all `
--silent `
--accept-package-agreements `
--accept-source-agreements `
--disable-interactivity
Dieses Skript aktualisiert zunächst die Quellen und versucht anschließend, sämtliche verfügbaren Updates unbeaufsichtigt zu installieren.
Besser: Updates zunächst protokollieren
Für professionelle Umgebungen empfiehlt sich Logging.
Beispiel:
$LogFile = "C:\Logs\Winget-Update.log"
"==============================" | Out-File $LogFile -Append
"Start: $(Get-Date)" | Out-File $LogFile -Append
winget source update 2>&1 |
Out-File $LogFile -Append
winget upgrade --all `
--silent `
--accept-package-agreements `
--accept-source-agreements `
--disable-interactivity 2>&1 |
Out-File $LogFile -Append
"Ende: $(Get-Date)" | Out-File $LogFile -Append
Damit lässt sich später nachvollziehen, welche Updates durchgeführt wurden und welche Fehler aufgetreten sind.
Automatisierung mit der Windows-Aufgabenplanung
Das PowerShell-Skript kann anschließend beispielsweise gespeichert werden als:
C:\Scripts\Winget-Update.ps1
In der Windows-Aufgabenplanung kann dann eine neue Aufgabe erstellt werden.
Als Programm:
powershell.exe
Argumente:
-NoProfile -ExecutionPolicy Bypass -File "C:\Scripts\Winget-Update.ps1"
Als Trigger könnte beispielsweise ein wöchentlicher Zeitpunkt verwendet werden.
Für Arbeitsplatzrechner bietet sich etwa ein Wartungsfenster außerhalb der Hauptarbeitszeit an.
Beispiel: Wöchentlich aktualisieren
Ein sinnvoller Ablauf könnte folgendermaßen aussehen:
Sonntag 03:00 Uhr
↓
Paketquellen aktualisieren
↓
Verfügbare Updates prüfen
↓
Freigegebene Anwendungen aktualisieren
↓
Logdatei schreiben
↓
Ergebnis auswerten
In Unternehmen sollte ein solches Verfahren allerdings mit Patchmanagement-, Freigabe- und Wartungsprozessen abgestimmt werden.
Warum winget upgrade --all nicht automatisch für jeden Unternehmens-PC ideal ist
Der Befehl:
winget upgrade --all
ist komfortabel.
Er bedeutet aber gleichzeitig:
Installiere alle von Winget erkannten verfügbaren Updates.
In einem privaten Umfeld kann das hervorragend funktionieren.
In einer professionellen Umgebung bestehen dagegen zusätzliche Anforderungen:
- getestete Softwareversionen
- Fachverfahrens-Kompatibilität
- Herstellerfreigaben
- Change Management
- Wartungsfenster
- Softwarelizenzierung
- Patchgruppen
- Rollback-Planung
- Dokumentation
Deshalb sollte Winget dort eher als Bestandteil eines kontrollierten Update-Prozesses eingesetzt werden.
Typische Fehler: Kein Update gefunden
Winget meldet möglicherweise:
No applicable upgrade found.
Mögliche Ursachen:
- Die neueste Version ist bereits installiert.
- Das Paket ist gepinnt.
- Die installierte Anwendung kann nicht eindeutig zugeordnet werden.
- Die Paketquelle enthält noch keine neuere Version.
- Die lokale Version ist unbekannt.
- Architektur oder Installer stimmen nicht überein.
Zunächst empfiehlt sich:
winget list
und anschließend:
winget upgrade
Typischer Fehler: Version kann nicht ermittelt werden
Wenn Winget die installierte Version nicht feststellen kann, wird das Paket normalerweise nicht automatisch aktualisiert.
Bei bewusster Entscheidung kann:
winget upgrade --all --include-unknown
verwendet werden.
Dies sollte insbesondere bei automatisierten Skripten zuvor getestet werden.
Typischer Fehler: Paket ist gepinnt
Ein Paket erscheint möglicherweise als Update, wird aber nicht aktualisiert.
Pins anzeigen:
winget pin list
Pin entfernen:
winget pin remove --id <Paket-ID>
Oder – bei einem normalen nicht blockierenden Pin – bewusst einbeziehen:
winget upgrade --all --include-pinned
Typischer Fehler: Installer läuft noch
Einige Programme können nicht aktualisiert werden, solange sie geöffnet sind.
Typische Beispiele sind:
- Browser
- Editoren
- Kommunikationsprogramme
- Entwicklungstools
Der Installer kann dann:
- das Update verweigern
- einen Neustart verlangen
- das Programm automatisch schließen
- einen Benutzerhinweis anzeigen
Für automatisierte Updates außerhalb der Arbeitszeit ist dieses Problem meist geringer.
Typischer Fehler: Administratorrechte fehlen
Einige Installationen benötigen erhöhte Rechte.
Wird ein Update ohne ausreichende Berechtigungen gestartet, kann es scheitern.
In diesem Fall sollte PowerShell beziehungsweise Windows Terminal mit den erforderlichen Rechten ausgeführt werden.
Bei geplanten Aufgaben kann außerdem die Option:
Mit höchsten Privilegien ausführen
notwendig sein.
Typischer Fehler: Paketquelle nicht erreichbar
Wenn Winget keine aktuellen Paketinformationen erhält, sollte zunächst Folgendes ausgeführt werden:
winget source update
Anschließend:
winget source list
Bei Problemen können zusätzlich relevant sein:
- Proxy
- Firewall
- DNS
- TLS-Verbindungen
- Unternehmensfilter
- Authentifizierung
Aktuelle Winget-Versionen besitzen außerdem eigene --proxy- und --no-proxy-Optionen für den jeweiligen Aufruf.
Fehlerprotokolle öffnen
Winget kann seine Logs direkt öffnen:
winget upgrade --open-logs
Für ausführlichere Protokollierung steht:
--verbose-logs
zur Verfügung.
Beispielsweise:
winget upgrade --id Mozilla.Firefox --verbose-logs
Gerade bei schwer nachvollziehbaren Installerproblemen sind diese Logs sehr hilfreich.
Sicherheitsprüfungen nicht deaktivieren
Winget besitzt auch beim Upgrade die Option:
--ignore-security-hash
Microsoft kennzeichnet sie ausdrücklich als nicht empfohlen.
Der Hash-Abgleich gehört zu den Sicherheitsmechanismen von Winget.
Ein fehlgeschlagener Hashvergleich sollte daher untersucht und nicht einfach ignoriert werden.
Best Practice für private Systeme
Für einen privaten Windows-PC kann ein einfacher regelmäßiger Ablauf ausreichen:
winget upgrade
Updates prüfen.
Anschließend:
winget upgrade --all
Updates installieren.
Wer einen weitgehend automatisierten Ablauf wünscht:
winget upgrade --all `
--silent `
--accept-package-agreements `
--accept-source-agreements
Best Practice für Unternehmen
In Unternehmensumgebungen sollte der Prozess strukturierter aufgebaut werden:
Updates ermitteln
↓
kritische Anwendungen identifizieren
↓
Testsysteme aktualisieren
↓
Kompatibilität prüfen
↓
Version freigeben
↓
Pins anpassen
↓
Produktivsysteme aktualisieren
↓
Logging
↓
Erfolg kontrollieren
Winget kann diesen Prozess hervorragend unterstützen, ersetzt jedoch keine organisatorische Patchmanagement-Strategie.
Ein mögliches PowerShell-Grundgerüst
Ein etwas robusteres Beispiel könnte folgendermaßen aussehen:
$LogPath = "C:\Logs"
$LogFile = Join-Path $LogPath "Winget-$(Get-Date -Format 'yyyy-MM-dd').log"
if (-not (Test-Path $LogPath)) {
New-Item -ItemType Directory -Path $LogPath -Force | Out-Null
}
"Winget Update gestartet: $(Get-Date)" |
Out-File $LogFile -Append
winget source update 2>&1 |
Out-File $LogFile -Append
winget upgrade 2>&1 |
Out-File $LogFile -Append
winget upgrade --all `
--silent `
--accept-package-agreements `
--accept-source-agreements `
--disable-interactivity 2>&1 |
Out-File $LogFile -Append
"Winget Update beendet: $(Get-Date)" |
Out-File $LogFile -Append
Dieses Beispiel kann als Ausgangspunkt dienen und später beispielsweise um Exitcodes, Benachrichtigungen oder zentrale Logübertragung erweitert werden.
Die wichtigsten Befehle im Überblick
Updates anzeigen:
winget upgrade
Ein einzelnes Paket aktualisieren:
winget upgrade --id <Paket-ID> --exact
Alle Pakete aktualisieren:
winget upgrade --all
Silent aktualisieren:
winget upgrade --all --silent
Unbekannte Versionen einbeziehen:
winget upgrade --all --include-unknown
Pins anzeigen:
winget pin list
Paket von --all ausschließen:
winget pin add --id <Paket-ID>
Update vollständig blockieren:
winget pin add --id <Paket-ID> --blocking
Versionsbereich festlegen:
winget pin add --id <Paket-ID> --version 1.2.*
Pin entfernen:
winget pin remove --id <Paket-ID>
Gepinnte Pakete bewusst berücksichtigen:
winget upgrade --all --include-pinned
Neustart zulassen:
winget upgrade --all --allow-reboot
Verbose Logging aktivieren:
winget upgrade --all --verbose-logs
Mit winget upgrade besitzt Windows einen ausgesprochen leistungsfähigen Mechanismus zur zentralen Aktualisierung installierter Anwendungen.
Für einzelne Programme genügt:
winget upgrade --id <Paket-ID> --exact
und mit:
winget upgrade --all
lassen sich nahezu alle erkannten Anwendungen mit verfügbaren Updates in einem Durchgang aktualisieren.
Besonders interessant wird Winget jedoch durch die Kombination mit Pins. Anwendungen können von automatischen Updates ausgeschlossen, vollständig blockiert oder auf bestimmte Versionsbereiche begrenzt werden. Dadurch lässt sich das Update-Verhalten deutlich genauer kontrollieren.
In Verbindung mit PowerShell, Logging und der Windows-Aufgabenplanung kann daraus schließlich ein weitgehend automatisierter Update-Prozess entstehen.
Für private Systeme ist winget upgrade --all ein komfortables Werkzeug. In Unternehmen und Behörden sollte Winget dagegen in einen geregelten Patch-, Test- und Freigabeprozess eingebettet werden. Genau dort spielt die Kombination aus Automatisierung und Versionskontrolle ihre größten Stärken aus.