- Die Registrierung (Deinstallationsschlüssel) ist die zuverlässigste Quelle für die Anzeigen unter „Programme hinzufügen oder entfernen“.
- Win32_Product funktioniert für MSIs, ist aber langsam und kann Reparaturen verursachen. Verwenden Sie es mit Vorsicht.
- Get-Package listet PackageManagement-Pakete (PowerShellGet/NuGet) auf, nicht die gesamte Systemsoftware.
- Exportieren und vergleichen Sie mit TXT/CSV und Compare-Object; Geek Uninstaller und UninstallView optimieren die Berichterstellung.
Wenn Sie schon einmal schnell herausfinden mussten, welche Programme auf einem Computer vorhanden sind WindowsEgal, ob Sie Server ohne grafische Oberfläche verwalten oder Ihr System neu installieren, Sie benötigen eine zuverlässige Bestandsaufnahme. In diesem Artikel erkläre ich dies Schritt für Schritt im Detail. alle Möglichkeiten zum Auflisten und Exportieren installierter Software Verwendung Powershell, WMI, die Registrierung und Tools von Drittanbietern.
Wir werden mehrere bewährte Techniken integrieren und ihre Vor- und Nachteile erläutern. Sie werden sehen, Befehle direkt zu erweiterten Optionen wie Get-Package mit PackageManagement, Registry-Abfragen (Deinstallation), Remote-Ausführung und sogar Vergleichen zwischen Einträgen vor und nach formatearDarüber hinaus werden wir TXT-/CSV-/HTML-Exportoptionen hinzufügen und für diejenigen, die dies bevorzugen, Dienstprogramme von Drittanbietern, die dies mit nur zwei Klicks erledigen.
Warum es sich lohnt, Ihre Programme aufzulisten
Ein übersichtliches Inventar verhindert Versehen bei der Neuinstallation und hilft, nicht mehr benötigte Software zu erkennen. Auf vielen Computern sammeln sich ungetestete Anwendungen an, die in Vergessenheit geraten, Speicherplatz beanspruchen und, schlimmer noch, einige bleiben im Hintergrund und verbrauchen Ressourcen ohne dass Sie es merken.
Eine Liste ermöglicht Ihnen einen Überblick, anstatt durch die Oberfläche „Apps & Features“ zu scrollen. Dies erleichtert außerdem Support, Auditing und Compliance und spart Ihnen Zeit, wenn Sie mehrere Windows Core-PCs oder -Server verwalten, auf denen Es gibt keine GUI und alles wird über die Konsole erledigt..
Diese Techniken funktionieren auf mehreren Windows-Versionen, einschließlich Windows Server 2012 R2, 2016, 2019 und Windows 7/10/11, mit Nuancen, die wir bei Bedarf kommentieren werden.
Sie werden später sehen, dass nicht alle Methoden dasselbe anzeigen: PowerShell, WMI, die Registrierung und PackageManagement fragen alle unterschiedliche Quellen ab. Aus diesem Grund ist es wichtig zu wissen, was jede Technik abdeckt und welche Grenzen sie hat. um jeweils das Richtige auszuwählen.

Schnelle PowerShell-Methoden zum Anzeigen installierter Programme
PowerShell bietet direkte Pfade zur Ausgabe einer Liste. Beginnen wir mit dem einfachsten: Überprüfen Sie die Deinstallationsschlüssel in der Registrierung, was eigentlich die klassische Ansicht „Programme hinzufügen/entfernen“ antreibt.
Der Alias gp (Get-ItemProperty) Ermöglicht das schnelle Lesen von Eigenschaften. Sie können zwei Pfade (64-Bit und 32-Bit) kombinieren und nach Elementen mit sichtbaren Namen filtern:
gp HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*, HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | Where-Object { -not ::IsNullOrWhiteSpace($_.DisplayName) } | Select-Object DisplayName
Wenn Sie eine strukturiertere Darstellung bevorzugen (Name, Version, Herausgeber, Datum), trennen Sie diese nach Architektur und Format in einer kompakten Tabelle zur Überprüfung auf dem Bildschirm. funktioniert sehr gut zum schnellen Lesen:
# 64 bits
Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Select-Object DisplayName, DisplayVersion, Publisher, InstallDate | Format-Table -AutoSize
# 32 bits
Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | Select-Object DisplayName, DisplayVersion, Publisher, InstallDate | Format-Table -AutoSize
Es gibt auch den WMI/WMIC-Weg, um über Windows Installer installierte Software zu finden. Die typischen Befehle sind diese beiden, obwohl Sie unten ihre Einschränkungen sehen: Sie können langsam sein und MSI-Reparaturen verursachen.
# Win32_Product (WMI)
Get-WmiObject -Class Win32_Product | Select-Object -Property Name
# Alias rápido
gwmi Win32_Product
# WMIC clásico
wmic product get name,version
Schließlich versuchen viele Leute Get-Package. Hinweis: Get-Package listet nur Pakete auf, die über PackageManagement (NuGet/PowerShellGet und ähnliche) installiert wurden., nicht für alle herkömmliche Systemsoftware. Es ist jedoch nützlich für Module und Skripte, die aus Repositories installiert werden.
# Paquetes gestionados por PackageManagement
Get-Package
# Todas las versiones de un proveedor concreto
Get-Package -ProviderName PowerShellGet -AllVersions
# Versión concreta de un paquete
Get-Package -Name PackageManagement -ProviderName PowerShellGet -RequiredVersion 1.3.1
Wenn Sie mehrere Computer verwalten, können Sie PowerShell Remoting verwenden, um verwaltete Pakete remote abzufragen. Beispiel: Sie führen Get-Package auf Server01 aus mit gültigen Anmeldeinformationen:
Invoke-Command -ComputerName Server01 -Credential CONTOSO\TestUser -ScriptBlock { Get-Package }
Exportieren Sie die Liste in TXT oder CSV und vergleichen Sie Vorher/Nachher
Die Anzeige auf dem Bildschirm ist in Ordnung, aber das Speichern in einer Datei ist praktischer. Mit PowerShell können Sie die Ausgabe an einen TXT sortiert nach Programmnamen um es in Ruhe durchzugehen oder zu teilen.
# 32 bits en TXT
Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* |
Select-Object DisplayName, DisplayVersion, Publisher, InstallDate |
Sort-Object DisplayName |
Out-File -FilePath "C:\Users\TuUsuario\Documents\InstalledPrograms.txt"
Wenn Sie eine in Excel/LibreOffice lesbare CSV-Datei bevorzugen, können Sie beide Zweige (64 und 32 Bit) in eine gemeinsame Datei exportieren. Das klassische Beispiel gibt mit Out-File die Erweiterung .csv aus; für eine echte CSV-Datei ist es jedoch besser, Export-Csv -NoTypeInformation.
# 64 bits a CSV
Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* |
Select-Object DisplayName, DisplayVersion, Publisher, InstallDate |
Sort-Object DisplayName |
Export-Csv -NoTypeInformation -Encoding UTF8 -Path "C:\Ruta\De\Tu\Archivo\Programas.csv"
# 32 bits al mismo CSV (añadiendo)
Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* |
Select-Object DisplayName, DisplayVersion, Publisher, InstallDate |
Sort-Object DisplayName |
Export-Csv -NoTypeInformation -Encoding UTF8 -Append -Path "C:\Ruta\De\Tu\Archivo\Programas.csv"
Wenn das Ziel darin besteht, das System ohne Verlust neu zu installieren, ist es hilfreich, eine „Vorher“- und „Nachher“-Liste zu erstellen und diese zu vergleichen. Vergleichsobjekt: Sie können schnell sehen, was fehlt oder was zusätzlich ist; Sie können es auch mit Anleitungen für kombinieren Automatisieren Sie die Installation von Software und Treibern nach der Formatierung.
Compare-Object -ReferenceObject (Get-Content C:\Users\TuUsuario\Documents\InstalledPrograms.txt) \
-DifferenceObject (Get-Content C:\Users\TuUsuario\Documents\InstalledPrograms2.txt)
Schauen Sie sich die Spalte SideIndicator an: Das Symbol => zeigt an, dass es sich in der zweiten Datei befindet und nicht in der ersten, während <= das Gegenteil bedeutet. Wenn = erscheint, bedeutet das Element erscheint ohne Unterschiede auf beiden Listen.

Überprüfen Sie die Registrierung: Deinstallationsschlüssel, Anzahl und Eigenschaften
Die meisten herkömmlichen Installationsprogramme speichern Deinstallationsinformationen in der Registrierung. Wenn Sie also eine Liste ähnlich der unter "Programme hinzufügen oder entfernen" benötigen, Die zuverlässigste Quelle ist der Deinstallationsschlüssel des Teams.
Der Hauptpfad lautet: HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall, und für 32-Bit-Anwendungen auf 64-Bit-Systemen gibt es auch den Zweig: HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall.
Um zu zählen, wie viele Anwendungen in einer bestimmten Branche registriert sind, können Sie verwenden Get-ChildItem und ermitteln Sie die Anzahl der Unterschlüssel:
$UninstallPath = 'HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall'
(Get-ChildItem -Path $UninstallPath).Count
Wenn Sie bestimmte Eigenschaften extrahieren möchten (z. B. nur den Anzeigenamen), können Sie die Registrierungswerte mit abrufen GetValue('Anzeigename') und sortieren Sie sie für ein angenehmeres Lesen:
Get-ChildItem -Path $UninstallPath |
ForEach-Object { $_.GetValue('DisplayName') } |
Sort-Object
Um Objekte mit mehreren Eigenschaften zusammenzustellen (ähnlich wie bei Win32Reg_AddRemovePrograms von SCCM), können Sie eine kleine Pipeline erstellen, die eine Kennung, einen Herausgeber, eine Version und ein Installationsdatum hinzufügt. Auf diese Weise erhalten Sie ein vollständigeres Inventar:
Get-ChildItem $UninstallPath |
ForEach-Object {
$ProdID = ($_.Name -split '\\')
Get-ItemProperty -Path "$UninstallPath\$ProdID" -ErrorAction SilentlyContinue |
Select-Object DisplayName, InstallDate, @{n='ProdID'; e={$ProdID}}, Publisher, DisplayVersion
} | Select-Object -First 10
Dieser Ansatz vermeidet die Nachteile von Win32_Product (langsam und mit MSI-Nebeneffekten) und ist nicht von SCCM als Klasse abhängig Win32Reg_AddRemovePrograms, was es sehr nützlich für lokale Audits ohne zusätzliche Infrastruktur macht.
WMI/WMIC: Wann wird es verwendet und welche Risiken bestehen?
Windows Installer-bezogene WMI-Klassen (wie Win32_Product) geben nur mit MSI installierte Software zurück, ausgenommen Installer, die andere Engines verwenden. Darüber hinaus Die Abfrage von Win32_Product kann Reparaturen von MSI-Produkten auslösen und dauern lange, was auf Produktionsservern nicht ideal ist.
Dennoch gibt es Umgebungen, in denen Sie interessiert sein werden extrahieren Sie genau das, was Sie „wissen“ Windows Installer. Dafür sind sie da:
Get-WmiObject -Class Win32_Product | Select-Object -Property Name
gwmi Win32_Product
wmic product get name,version
Wenn Sie diese Befehle verwenden, tun Sie dies mit der gebotenen Sorgfalt und während Wartungsfenstern. Für allgemeine Inventare, Die Registry-Methode ist in der Regel sicherer und schneller, und deckt darüber hinaus ein breiteres Anwendungsspektrum ab.
Get-Package im Detail: Was es tatsächlich auflistet und nützliche Parameter
Get-Package gehört zu PackageManagement (OneGet) und gibt Pakete zurück, die von ihren Anbietern (PowerShellGet, NuGet usw.) installiert wurden, bezogen auf die die beliebtesten Softwarepaket-Installationsprogramme.
Die Basissyntax unterstützt Filter nach Namen und Versionen. Sie können den Anbieter bei Bedarf zur Initialisierung zwingen (Bootstrap), alle Versionen auflisten und Eingrenzen nach Anbieter (PowerShellGet, NuGet) oder nach Typ (Module, Skripte):
Get-Package <String[]>]
>]
Wichtige Parameter, die Sie kennen sollten (einige sind dynamisch und hängen vom Anbieter ab): Hier ist die wesentliche Rezension:
- -Name: ein oder mehrere Namen (Platzhalter werden unterstützt). Nützlich zum Suchen bestimmter Pakete.
- -Anbietername: Filtern nach Anbieter; typische Werte: Bootstrap, NuGet, PowerShellGet. Am besten mit -AllVersions kombinieren.
- -AlleVersionen: Gibt alle installierten Versionen zurück, nicht nur die neueste.
- -ErforderlicheVersion, -MinimumVersion, -MaximumVersion: Begrenzen Sie die genaue Version oder den Versionsbereich, der zurückgegeben werden soll.
- -Umfang: CurrentUser oder AllUsers, je nachdem, wo das Paket installiert ist.
- -Force: Vermeiden Sie Bestätigungen und erzwingen Sie den Befehl, wenn dies angebracht ist.
- -ForceBootstrap: Installiert automatisch den erforderlichen Anbieter, falls dieser nicht vorhanden ist.
- -AllowPrereleaseVersions: schließt vorläufige Versionen in die Ergebnisse ein.
- -InstallUpdate: Für Szenarien, in denen Get-Package Updates mit Anbietern installieren kann, die dies unterstützen.
- -Typ (PowerShellGet): Modul, Skript oder Alle.
- -Version ausschließen und -Destination (NuGet): beeinflussen den Ordnernamen und das Extraktionsverzeichnis, falls zutreffend.
- -Abhängigkeiten überspringen (NuGet): Abhängigkeitssuche überspringen.
- -SkipPublisherCheck (PowerShellGet): Ignorieren Sie in bestimmten Fällen Herausgeberprüfungen.
- -PackageManagementProvider: Gibt den Paketverwaltungsanbieter an.
- -NoPathUpdate: Dynamischer Install-Script-Parameter; gilt eigentlich nicht für Get-Package.
- Gemeinsame Parameter: Ausführlich, Debug, ErrorAction, WarningAction, OutVariable usw.
Typische praktische Beispiele sind das Auflisten aller mit PowerShellGet installierten Elemente, die Suche nach einer bestimmten Version und sogar die Deinstallation durch Verkettung mit Deinstallationspaket durch Channeling:
# Todo lo de PowerShellGet, con todas las versiones
Get-Package -ProviderName PowerShellGet -AllVersions
# Versión exacta de PackageManagement
Get-Package -Name PackageManagement -ProviderName PowerShellGet -RequiredVersion 1.3.1
# Desinstalar una versión concreta de un paquete
Get-Package -Name posh-git -RequiredVersion 0.7.3 | Uninstall-Package
Beachten Sie, dass Get-Package remote-kompatibel ist (Invoke-Command oder Enter-PSSession) und dass Anbieter dynamische Parameter hinzufügen können. Die Ausgabe ist ein Objekt vom Typ Microsoft.PackageManagement.Packaging.SoftwareIdentity, mit Paketmetadaten.
Was ist mit „manuell installierter“ Software? Zu beachtende Einschränkungen
Es gibt Anwendungen, die durch Kopieren von Ordnern bereitgestellt werden und kein Deinstallationsprogramm registrieren. Diese werden weder in Uninstall oder Win32_Product noch in PackageManagement angezeigt. In diesen Fällen verwalten Sie sie als Dateien und Ordner, indem Sie die Techniken für Programme manuell installieren, mit Skripten, die nach bestimmten Pfaden, ausführbaren Dateien oder Signaturen suchen.
Aus demselben Grund können zwei Computer mit derselben Software unterschiedliche Ergebnisse anzeigen, wenn auf einem MSI und auf dem anderen MSI installiert wurde. mit einem anderen Installationsprogramm, ohne die Deinstallation aufzuzeichnenDie ideale Bestandsaufnahme kombiniert je nach Umgebung mehrere Techniken.
Remoteausführung und Windows-Versionskompatibilität
Für Server und PC-Flotten ist PowerShell Remoting die beste Lösung. Mit einer Remote-Sitzung (Enter-PSSession) oder einem Befehlsaufruf (Invoke-Command) können Sie Daten mit denselben Befehlen erfassen, die Sie verwendet haben. Zentralisierung des Inventars von Ihrem Computer aus.
Einfaches Beispiel zum Abfragen von Get-Package auf einem Remote-Server mit gültigen Domänenanmeldeinformationen, ideal, wenn Sie WinRM bereits konfiguriert haben:
Invoke-Command -ComputerName Server01 -Credential CONTOSO\TestUser -ScriptBlock { Get-Package }
Registrierungstechniken (Deinstallation) funktionieren unter Windows 7/10/11 und Windows Server 2012 R2/2016/2019, während Get-Package erfordert Paketverwaltung und Lieferanten entsprechend vorhanden oder selbstinstallierbar (ForceBootstrap hilft).
Leidenschaftlicher Autor über die Welt der Bytes und der Technologie im Allgemeinen. Ich liebe es, mein Wissen durch Schreiben zu teilen, und genau das werde ich in diesem Blog tun und Ihnen die interessantesten Dinge über Gadgets, Software, Hardware, technologische Trends und mehr zeigen. Mein Ziel ist es, Ihnen dabei zu helfen, sich auf einfache und unterhaltsame Weise in der digitalen Welt zurechtzufinden.
