Windows System

Winget Teil 6 – Programme aktualisieren und Updates automatisieren

Software zu installieren ist nur die halbe Arbeit – sie muss auch aktuell gehalten werden. Mit Winget lassen sich verfügbare Updates zentral ermitteln, einzelne Programme gezielt aktualisieren oder nahezu der gesamte Softwarebestand automatisiert auf einen neuen Stand bringen. In diesem Teil der Serie zeigen wir ausführlich, wie winget upgrade funktioniert, wie Programme ausgeschlossen oder auf bestimmte Versionsbereiche begrenzt werden und wie sich regelmäßige Updates per PowerShell und Aufgabenplanung automatisieren lassen.

10 min Lesezeit
Grafik: Winget - Programme aktualisieren und automatisieren

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.