Powershell – Überprüfen und finden Sie die Produkt-GUID eines installierten MSI-Setups

Um diesen Abschnitt vollständig freizuschalten, müssen Sie sich anmelden

Der Produktcode ist die eindeutige GUID zur Identifizierung einer Anwendung oder eines Produktreleases. Mit anderen Worten, verschiedene Versionen und Sprachen des Produkts müssen unterschiedliche Produktcodes haben.

Außerdem kann ProductCode verwendet werden, um den Funktionsstatus und den Produktzustand abzufragen. Zum Beispiel Installer API „MsiQueryFeatureStateEx ()“ und „MsiQueryProductState ()“, etc.

Die folgenden vier Ansätze können uns verschiedene Methoden geben, um die GUID installierter MSI-Pakete zu finden und abzurufen (auch aus der Ferne):

Verwenden Sie den Powershell- „Einzeiler“

Jede durch diese Option ausgelöste Selbstreparatur sollte im Allgemeinen abgebrochen werden können. Die ausgelösten Paketintegritätsprüfungen fügen jedoch etwas „Rauschen“ im Ereignisprotokoll hinzu. Nehmen Sie nicht an, dass IdentifyingNumber der Produktcode (WMI-Code) ist.

get-wmiobject Win32_Product | Format-Table IdentifyingNumber, Name, LocalPackage -AutoSize

Schnellstart von Powershell: halten Sie die Windows-Taste gedrückt, tippen Sie auf R, geben Sie „Powershell“ ein und drücken Sie die Eingabetaste.

VBScript verwenden

Diese Option ist möglicherweise sicherer als Powershell aus Gründen, die im Folgenden ausführlich erläutert werden.

Im Wesentlichen ist es (viel) schneller und kann keine MSI-Selbstreparatur auslösen, da es nicht über WMI ausgeführt wird (es greift direkt auf die MSI COM-API zu – mit Blasengeschwindigkeit). Es ist jedoch komplizierter als die Powershell-Option (mehrere Codezeilen).

Sie können ein VBScript ausprobieren, um über die MSI-Automatisierungsschnittstelle auf Informationen zuzugreifen (Kernfunktion von Windows – es hat nichts mit WMI zu tun).

  • Kopieren Sie das folgende Skript und fügen Sie es in ein * ein.vbs-Datei auf Ihrem Desktop, und versuchen Sie es durch Doppelklick auszuführen. Ihr Desktop muss für Sie beschreibbar sein, oder Sie können einen anderen beschreibbaren Speicherort verwenden.
  • Dies ist ein Beispiel-VBScript. Knappheit wurde der Fehlerbehandlung und Vollständigkeit vorgezogen, aber sie sollte die Arbeit mit minimaler Komplexität erledigen.
  • Die Ausgabedatei wird in dem Ordner erstellt, in dem Sie das Skript ausführen (Ordner muss beschreibbar sein). Die Ausgabedatei heißt msiinfo.csv.
  • Doppelklicken Sie auf die Datei, um sie in einem Tabellenkalkulationsprogramm zu öffnen, wählen Sie beim Importieren ein Komma als Trennzeichen aus – ODER öffnen Sie die Datei einfach in Notepad oder einem beliebigen Textbetrachter. Das Öffnen in einer Tabelle ermöglicht erweiterte Sortierfunktionen.
  • Dieses Skript kann leicht angepasst werden, um eine erhebliche Menge an weiteren Details zur MSI-Installation anzuzeigen.

'#### Retrieve all ProductCodes (with ProductName and ProductVersion)Set fso = CreateObject("Scripting.FileSystemObject")Set output = fso.CreateTextFile("msiinfo.csv", True, True)Set installer = CreateObject("WindowsInstaller.Installer")On Error Resume Next ' we ignore all errorsFor Each product In installer.ProductsEx("", "", 7) productcode = product.ProductCode name = product.InstallProperty("ProductName") version=product.InstallProperty("VersionString") output.writeline (productcode & ", " & name & ", " & version)Nextoutput.Close

Registry Lookup

Sie können den Produktcode auch finden, indem Sie die Registrierung anhand dieses Basisschlüssels durchsuchen: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall.

Drücken Sie die Taste F3 und suchen Sie nach Ihrem Produktnamen. Wenn es sich um ein 32-Bit-Installationsprogramm auf einem 64-Bit-Computer handelt, befindet es sich möglicherweise unter dem folgenden Schlüssel: HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ Microsoft\Windows\CurrentVersion\Uninstall.

Die folgenden Registrierungsschlüssel sind die allgemeinen Speicherorte, an denen die GUIDs von MSI-Paketen gesucht und gefunden werden:

HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\UninstallHKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\UninstallHKCU\Software\Microsoft\Windows\CurrentVersion\Uninstall

Original MSI-Datei

Sie finden den Produktcode in der Eigenschaftentabelle jeder MSI-Datei (und auch jeder anderen Eigenschaft). Die GUID könnte jedoch (selten) durch eine zum Zeitpunkt der Installation angewendete Transformation überschrieben werden und daher nicht mit der GUID übereinstimmen, unter der das Produkt registriert ist (Ansatz 1 und 2 oben geben den tatsächlichen Produktcode an, der bei Windows registriert ist) in solchen seltenen Szenarien).

Sie benötigen ein Tool, um MSI-Dateien anzuzeigen. Eine Liste der kostenlosen Tools, die Sie herunterladen können, finden Sie am Ende der folgenden Antwort (oder siehe Schnelloption unten): Wie kann ich den Inhalt von zwei (oder mehr) MSI-Dateien vergleichen?

Für Bequemlichkeit und Geschwindigkeit können Sie SuperOrca ohne Verzögerung und Aufhebens von diesem direkten Download-Hotlink herunterladen – das Tool ist gut genug, um die Arbeit zu erledigen – installieren, öffnen Sie MSI und gehen Sie direkt zur Property-Tabelle und finden Sie die ProductCode-Zeile (bitte überprüfen Sie immer einen direkten Download-Hotlink – offensichtlich – virustotal.com um dies zu tun – Online-Scan mit Dutzenden von Anti-Virus-und Malware-Suiten zu scannen, was Sie hochladen).

Ein weiteres, das Original-Tool Orca ist Microsofts eigenes Tool, es wird mit Visual Studio und dem Windows SDK installiert. Versuchen Sie, nach Orca-x86_de-us zu suchen.msi, unter Programme (x86) und installieren Sie die MSI, falls gefunden.

Produktcodes abrufen

Starten Sie Powershell (halten Sie die Windows-Taste gedrückt, tippen Sie auf R, lassen Sie die Windows-Taste los, geben Sie „powershell“ ein und drücken Sie OK) und führen Sie den folgenden Befehl aus, um eine Liste der installierten MSI-Paketproduktcodes zusammen mit dem lokalen Cache-Paketpfad und dem Produktnamen abzurufen (maximieren Sie das PowerShell-Fenster, um verkürzte Namen zu vermeiden).

Bevor Sie diese Befehlszeile ausführen, lesen Sie bitte den folgenden Haftungsausschluss (nichts Gefährliches, nur einige potenzielle Belästigungen). Wenn Sie versuchen, ein Paket zu deinstallieren, gibt es unten einen Abschnitt mit einigen Beispiel-msiexec.exe-Befehlszeilen:

get-wmiobject Win32_Product | Format-Table IdentifyingNumber, Name, LocalPackage -AutoSize

Die Ausgabe sollte ähnlich sein:

 Powershell - Überprüfen und finden Sie die Produkt-GUID eines installierten MSI-Setups

Aus irgendeinem seltsamen Grund wird der „ProduktCode“ in WMI als „IdentifyingNumber“ bezeichnet. Mit anderen Worten, im Bild oben ist die Identifikationsnummer der ProduktCode.

Aufgrund des seltsamen Microsoft-Designs löst jeder WMI-Aufruf von Win32_Product (wie der PowerShell-Befehl unten) eine Validierung des Paketstatus aus. Abgesehen davon, dass es ziemlich langsam ist, kann dies in seltenen Fällen eine MSI-Selbstreparatur auslösen. Dies kann ein kleines Paket oder etwas Großes sein – wie Visual Studio. In den meisten Fällen geschieht dies nicht, aber es besteht ein Risiko.

Führen Sie diesen Befehl nicht direkt vor einer wichtigen Besprechung aus, er ist niemals gefährlich (es handelt sich um eine schreibgeschützte Abfrage), kann jedoch in sehr seltenen Fällen zu einer langen Reparatur führen.

Sie können die Ausgabe auch in Listenform (anstelle von Tabellen) erhalten):

get-wmiobject -class Win32_Product

In diesem Fall ist die Ausgabe ähnlich:

 Powershell - Überprüfen und finden Sie die Produkt-GUID eines installierten MSI-Setups

Abrufen von Produktcodes von einem Remotecomputer

Theoretisch sollten Sie nur in der Lage sein, einen Remotecomputernamen als Teil des Befehls selbst anzugeben. Hier ist der gleiche Befehl wie oben eingerichtet, um auf der Maschine „RemoteMachine“ ausgeführt zu werden (-ComputerName RemoteMachine Abschnitt hinzugefügt):

get-wmiobject Win32_Product -ComputerName RemoteMachine | Format-Table IdentifyingNumber, Name, LocalPackage -AutoSize

Dies funktioniert möglicherweise, wenn Sie mit Domänenadministratorrechten auf einer richtigen Domäne ausgeführt werden. In einer Arbeitsgruppenumgebung (kleines Büro / Heimnetzwerk) müssen Sie wahrscheinlich Benutzeranmeldeinformationen direkt zu den WMI-Aufrufen hinzufügen, damit dies funktioniert.

Darüber hinaus sind Remoteverbindungen in WMI (mindestens) von der Windows-Firewall, den DCOM-Einstellungen und der Benutzerkontensteuerung (UAC) betroffen (sowie von zusätzlichen Nicht-Microsoft-Faktoren, z. B. zusätzlichen physischen oder virtuellen Firewalls, Software-Firewalls von Drittanbietern, Sicherheitssoftware verschiedener Art usw.). Ob es funktioniert oder nicht, hängt normalerweise von Ihrem genauen Setup ab.

Powershell

PowerShell erfordert die Installation von .NET Framework, aber auf den meisten modernen Betriebssystemen (Windows Server und Windows-Plattformen, Powershell ist bereits enthalten und verfügbar). Die eigentliche PowerShell-Anwendung selbst kann auch auf dem Computer fehlen, selbst wenn .NET installiert ist. Schließlich kann PowerShell durch verschiedene Systemrichtlinien und -berechtigungen deaktiviert oder gesperrt werden.

Wenn dies der Fall ist, können Sie einige andere Möglichkeiten zum Abrufen von Produktcodes ausprobieren. Eine Alternative ist VBScript – es ist schnell und flexibel (kann aber auch auf bestimmten Computern gesperrt werden, und Scripting ist immer etwas aufwändiger als die Verwendung von Tools).

Beginnen wir mit einem integrierten Windows-WMI-Tool, das normalerweise zum Testen von WMI-Komponenten und -Funktionen verwendet wird: wbemtest.exe.

  • Starten Sie wbemtest.exe (Halten Sie die Windows-Taste gedrückt, tippen Sie auf R, lassen Sie die Windows-Taste los und geben Sie „wbemtest.exe“ und drücken Sie OK).
  • Klicken Sie auf Verbinden und dann auf OK (der Namespace ist standardmäßig root\cimv2), und klicken Sie erneut auf „Verbinden“.
  • Klicken Sie auf „Abfrage“ und geben Sie diesen WQL-Befehl (SQL-Variante) ein: WÄHLEN SIE IdentifyingNumber, Name, Version AUS Win32_Product.
  • Klicken Sie auf „Verwenden“ (oder gleichwertig – das Tool wird lokalisiert).

Beispielausgabe Screenshot ist der folgende. Nicht die schönste Formatierung, aber Sie können die Daten erhalten, die Sie benötigen. IdentifyingNumber ist der MSI-Produktcode:

 Powershell - Überprüfen und finden Sie die Produkt-GUID eines installierten MSI-Setups

Als nächstes können Sie ein benutzerdefiniertes, voll ausgestattetes WMI-Tool wie WMIExplorer ausprobieren.exe.

  • Dies ist nicht in Windows enthalten. Es ist jedoch ein sehr gutes Werkzeug.
  • Überprüfen Sie es unter: https://github.com/vinaypamnani/wmie2/releases.
  • Starten Sie das Tool, klicken Sie auf Verbinden, doppelklicken Sie auf ROOT\CIMV2
  • Geben Sie auf der Registerkarte „Abfrage“die folgende Abfrage ein SELECT IdentifyingNumber,Name,Version FROM Win32_Product and press Execute.

Get MSI Packages GUID (Comparing ProductCode and UpgradeCode)

Starten Sie PowerShell: Halten Sie die Windows- und R-Taste gleichzeitig gedrückt, lassen Sie die Windows-Taste los, geben Sie „powershell“ ein und drücken Sie OK oder drücken Sie die Eingabetaste.

Kopieren Sie das folgende Skript vollständig und klicken Sie dann mit der rechten Maustaste in das PowerShell-Fenster.

Für Win32_Property filtern wir sowohl Zeilen als auch Spalten (UpgradeCode ist nur einer von vielen Zeilentypen). Seien Sie auf einen langsamen Vorgang vorbereitet, WMI führt solche Abrufe sehr langsam durch.

$wmipackages = Get-WmiObject -Class win32_product$wmiproperties = gwmi -Query "SELECT ProductCode,Value FROM Win32_Property WHERE Property='UpgradeCode'"$packageinfo = New-Object System.Data.Datatable$packageinfo.Columns.Add("Name")$packageinfo.Columns.Add("ProductCode")$packageinfo.Columns.Add("UpgradeCode")foreach ($package in $wmipackages) { $foundupgradecode = $false #Let's assume that no UpgradeCode is found yet. foreach ($property in $wmiproperties) { if ($package.IdentifyingNumber -eq $property.ProductCode) { $packageinfo.Rows.Add($package.Name,$package.IdentifyingNumber, $property.Value) $foundupgradecode = $true break } } if(-Not ($foundupgradecode)) { # No upgrade code found, add product code to list. $packageinfo.Rows.Add($package.Name,$package.IdentifyingNumber, "") }}$packageinfo | Format-table ProductCode, UpgradeCode, Name# Enable the following line to export to CSV (good for annotation). Set full path in quotes.# $packageinfo | Export-Csv "\MsiInfo.csv"

Der Upgrade-Code ist die eindeutige GUID zur Identifizierung einer Produktfamilie. Das heißt, die gleichen Produkte mit unterschiedlichen Versionen wurden wahrscheinlich für einige Releases ausgeliefert. Diese Produkte haben unterschiedliche ProduktCodes, aber sie sind miteinander verbunden, indem sie DENSELBEN UpgradeCode verwenden.

Angenommen, wir haben ein Produkt namens „Happy MSI“ geschrieben und dieses Produkt verfügt nur über ein MSI-Paket für die Bereitstellung auf dem Client-System.

Die erste Version dieses Produkts ist eigentlich das MSI-Paket mit dem Namen „version_1.msi“, und die zweite Version ist „version_2.msi“. Dann müssen diese beiden MSI denselben UpgradeCode haben. Wenn Benutzer „version_2.msi“ Auf ihrem System verwendet der Windows Installer den UpgradeCode, um zu entscheiden, ob frühere Versionen dieses Produkts bereits auf dem System vorhanden sind.

Installer API „MsiEnumRelatedProducts()“ verwendet den UpgradeCode, um alle Produkte der Familie abzufragen.

MSI-Pakete deinstallieren

Wenn Sie das MSI-Paket deinstallieren möchten und den Produktcode (GUID) dafür gefunden haben, können Sie dies wie folgt mit einer Eingabeaufforderung mit erhöhten Rechten tun (nach cmd suchen.exe, Rechtsklick und als Admin ausführen):

Option 1: Einfache, interaktive Deinstallation ohne Protokollierung (schnell und einfach):

msiexec.exe /x {00000000-0000-0000-0000-00000000000C}

Schnelle Parametererklärung:

  • / X = Deinstallationssequenz ausführen
  • {00000000-0000-0000-0000-00000000000C} = Produktcode für das zu deinstallierende Produkt

Sie können auch die (ausführliche) Protokollierung aktivieren und im stillen Modus ausführen, wenn Sie möchten, was uns zu Option 2 führt:

Option 2: Stille Deinstallation mit ausführlicher Protokollierung (besser für Batch-Dateien):

msiexec.exe /x {00000000-0000-0000-0000-00000000000C} /QN /L*V "C:\My.log" REBOOT=ReallySuppress

Schnelle Parametererklärung:

  • / X = Deinstallationssequenz ausführen
  • {00000000-0000-0000-0000-00000000000C} = Produktcode für das zu deinstallierende Produkt
  • /QN = Vollständig lautlos ausführen
  • /L*V „C:\My.log“ = Ausführliches Logging am angegebenen Pfad
  • REBOOT=ReallySuppress = Unerwarteten, plötzlichen Neustart vermeiden

Leave a Reply

Deine E-Mail-Adresse wird nicht veröffentlicht.