Wie kann ich die Produkt-GUID eines installierten MSI-Setups finden?

Ich benötige die Produkt-GUID für eine installierte MSI-Datei, um Wartungsarbeiten wie Patching, Deinstallation (How-to-Deinstallation) und auch für Auditing-Zwecke durchführen zu können.

Lösung

Für den Abruf von Upgrade-Codes: https://stackoverflow.com/questions/46637094/how-can-i-find-the-upgrade-code-for-an-installed-msi-file/46637095#46637095

Kurze Version

Die nachstehenden Informationen sind im Laufe der Zeit stark angewachsen und möglicherweise etwas zu umfangreich geworden. Wie man schnell an Produktcodes kommt? (vier Ansätze):

  1. Verwenden Sie den Powershell "One-Liner"**.

    Scroll down für Screenshot und Schritt-für-Schritt-Anleitung. Haftungsausschluss auch unten - kleine oder mittlere Risiken, je nachdem, wen Sie fragen. Für mich funktioniert es gut. Jede Selbstreparatur, die durch diese Option ausgelöst wird, sollte im Allgemeinen abgebrochen werden können. Die Paketintegritätsprüfungen, die dadurch ausgelöst werden, führen allerdings zu einem gewissen "Rauschen" im Ereignisprotokoll. Hinweis! Die "IdentifyingNumber" ist der "ProductCode" (WMI-Besonderheit).

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

Schnellstart von Powershell: Windows-Taste halten, R antippen, "powershell" eintippen und Enter dem Windows SDK. Versuchen Sie, nach Orca-x86_de-us.msi zu suchen - unter Program Files (x86)` und installieren Sie das MSI, wenn Sie es finden.

Und unten finden Sie die ursprüngliche Antwort, die "organisch gewachsen" in eine Menge von Details. Vielleicht sehen Sie sich den Abschnitt "MSI-Pakete deinstallieren" weiter unten an, wenn dies die Aufgabe ist, die Sie durchführen müssen.

Produkt-Codes abrufen

UPDATE: Wenn Sie auch den Upgrade-Code benötigen, lesen Sie diese Antwort: https://stackoverflow.com/questions/46637094/how-can-i-find-the-upgrade-code-for-an-installed-msi-file/46637095#46637095 (ruft die zugehörigen Produktcodes, Upgrade-Codes & Produktnamen in eine Tabellenausgabe - ähnlich der untenstehenden).

  • Kann ich PowerShell nicht verwenden? Siehe Abschnitt "Alternative Tools" unten.
  • Möchten Sie deinstallieren? Siehe Abschnitt "MSI-Pakete deinstallieren" weiter unten. 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-Pakete Produktcodes zusammen mit dem lokalen Cache-Paketpfad und dem Produktnamen zu erhalten (maximieren Sie das PowerShell-Fenster, um abgeschnittene Namen zu vermeiden). Bevor Sie diese Befehlszeile ausführen, lesen Sie bitte den folgenden Haftungsausschluss (nichts Gefährliches, nur einige potenzielle Unannehmlichkeiten). Abschnitt 3 unter "Alternative Tools" zeigt einen alternativen, nicht-WMI-basierten Weg, um dieselben Informationen mit VBScript zu erhalten. Wenn Sie versuchen, ein Paket zu deinstallieren, finden Sie unten einen Abschnitt mit einigen Beispiel-Befehlszeilen für msiexec.exe:
get-wmiobject Win32_Product | Format-Table IdentifyingNumber, Name, LocalPackage -AutoSize

Die Ausgabe sollte in etwa so aussehen: *Hinweis! Aus irgendeinem seltsamen Grund wird "ProductCode"* in WMI als "IdentifyingNumber" bezeichnet. Mit anderen Worten: In der obigen Abbildung ist die IdentifyingNumber der ProductCode. Wenn Sie diese Abfrage gegenüber vielen entfernten Computern ausführen müssen, lesen Sie den Abschnitt "Produktcodes von einem entfernten Computer abrufen" weiter unten. " DISCLAIMER** (wichtig, bitte vor Ausführung des Befehls lesen!): Aufgrund eines seltsamen Microsoft-Designs kann jeder WMI-Aufruf von Win32_Product

(wie der PowerShell-Befehl unten) eine Überprüfung des Pakets aus. Dies ist nicht nur sehr langsam, sondern kann in seltenen Fällen eine MSI-Selbstreparatur auslösen. Dies kann ein kleines Paket sein oder etwas riesiges - wie Visual Studio. In den meisten Fällen passiert das nicht - aber es besteht ein Risiko. Führen Sie diesen Befehl nicht direkt vor einem wichtigen Besprechung aus - es ist zwar nicht gefährlich (es ist schreibgeschützt), aber es könnte in sehr seltenen Fällen zu einer langen Reparatur führen (ich glaube, Sie können die Selbstreparatur auch abbrechen - es sei denn, das betreffende Paket verhindert dies aktiv, aber es wird neu gestartet, wenn Sie Win32_Product erneut aufrufen, und dies wird so lange andauern, bis Sie die Selbstreparatur beenden lassen - manchmal wird sie sogar fortgesetzt, wenn Sie sie beenden lassen: https://stackoverflow.com/questions/5501028/how-can-i-determine-what-causes-repeated-windows-installer-self-repair/6066263#6066263).

Und nur für das Protokoll: einige Leute berichten, dass sich ihre Ereignisprotokolle mit MsiInstaller EventID 1035-Einträgen füllen (siehe die Antwort des Codechefs) - offenbar verursacht durch WMI-Abfragen an die Klasse Win32_Product (ich persönlich habe das noch nie gesehen). Dies hat nicht direkt mit dem oben vorgeschlagenen Powershell-Befehl zu tun, sondern steht im Zusammenhang mit der allgemeinen Verwendung der WIM-Klasse Win32_Product. Sie können die Ausgabe auch in Listenform (anstelle einer Tabelle) erhalten:

get-wmiobject -class Win32_Product

In diesem Fall ist die Ausgabe ähnlich wie diese:

Abrufen von Produktcodes von einem entfernten Computer

Theoretisch sollten Sie einfach den Namen eines entfernten Computers als Teil des Befehls selbst angeben können. Hier ist derselbe Befehl wie oben, der auf dem Rechner "RemoteMachine" ausgeführt werden soll (Abschnitt -ComputerName RemoteMachine hinzugefügt):

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

Dies könnte funktionieren, wenn Sie mit Domänenadministratorrechten in einer richtigen Domäne arbeiten. In einer Arbeitsgruppenumgebung (kleines Büro/Heimnetzwerk) müssen Sie wahrscheinlich Benutzeranmeldeinformationen direkt zu den WMI-Aufrufen hinzufügen, damit es funktioniert. Außerdem werden Remote-Verbindungen in WMI von (mindestens) der Windows Firewall, den DCOM-Einstellungen und der Benutzerkontensteuerung (UAC) beeinträchtigt (sowie von allen zusätzlichen, nicht von Microsoft stammenden Faktoren - z. B. reale Firewalls, Software-Firewalls von Drittanbietern, Sicherheitssoftware verschiedener Art usw.). Ob es funktioniert oder nicht, hängt von Ihrer genauen Konfiguration ab.

  • Einrichten einer entfernten WMI-Verbindung
  • Verbinden mit WMI per Fernzugriff mit PowerShell UPDATE: Einen ausführlichen Abschnitt über die Ausführung von Remote-WMI finden Sie in dieser Antwort: https://stackoverflow.com/questions/46637094/how-can-i-find-the-upgrade-code-for-an-installed-msi-file/46637095#46637095. Es scheint, dass eine Firewall-Regel und die Unterdrückung der UAC-Eingabeaufforderung über eine Registrierungsänderung die Dinge in einer Arbeitsgruppennetzwerkumgebung zum Laufen bringen können. Aus Sicherheitsgründen werden diese Änderungen nicht empfohlen, aber bei mir hat es funktioniert.

    Alternative Werkzeuge

    PowerShell erfordert die Installation des .NET-Frameworks (derzeit in der Version 3.5.1, wie es scheint? Oktober 2017). Die eigentliche PowerShell-Anwendung selbst kann auch auf dem Rechner fehlen, selbst wenn .NET installiert ist. Schließlich glaube ich, dass PowerShell durch verschiedene Systemrichtlinien und Berechtigungen deaktiviert oder gesperrt werden kann. Wenn dies der Fall ist, können Sie einige andere Möglichkeiten zum Abrufen von Produktcodes ausprobieren. Meine bevorzugte Alternative ist VBScript - es ist schnell und flexibel (kann aber auch auf bestimmten Rechnern gesperrt sein, und Skripterstellung ist immer ein wenig aufwändiger als die Verwendung von Tools).

  1. Beginnen wir mit einem eingebauten Windows WMI-Tool: wbemtest.exe.
  • Starten Sie wbemtest.exe (Halten Sie die Windows-Taste gedrückt, tippen Sie auf R, lassen Sie die Windows-Taste los, geben Sie "wbemtest.exe" ein 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 "Query" und geben Sie diesen WQL-Befehl (SQL-Variante) ein: SELECT IdentifyingNumber,Name,Version FROM Win32_Product und klicken Sie auf "Verwenden" (oder gleichwertig - das Tool wird lokalisiert).
  • Beispielbildschirmausdruck (abgeschnitten). Nicht die schönste Formatierung, aber Sie können die Daten erhalten, die Sie benötigen. IdentifyingNumber ist der MSI-Produktcode:
  1. Als nächstes können Sie ein benutzerdefiniertes WMI-Tool mit größerem Funktionsumfang wie WMIExplorer.exe ausprobieren.
  • Dies ist nicht in Windows enthalten. Es ist jedoch ein sehr gutes Werkzeug. Empfohlen.
  • Sehen Sie es sich an: https://github.com/vinaypamnani/wmie2/releases
  • Starten Sie das Tool, klicken Sie auf Verbinden, doppelklicken Sie auf ROOT\CIMV2
  • Geben Sie auf der Registerkarte "Query" die folgende Abfrage ein: SELECT IdentifyingNumber,Name,Version FROM Win32_Product und drücken Sie auf Execute.
  • Screenshot übersprungen, die Anwendung benötigt zu viel Bildschirmfläche.
  1. Schließlich können Sie ein VBScript ausprobieren, um auf Informationen über die MSI-Automatisierungsschnittstelle zuzugreifen (Kernfunktion von Windows - sie hat keine Beziehung zu WMI).
  • Kopieren Sie das unten stehende Skript und fügen Sie es in eine *.vbs-Datei auf Ihrem Desktop ein, und versuchen Sie, es per Doppelklick auszuführen. Ihr Desktop muss beschreibbar sein, oder Sie können einen anderen beschreibbaren Speicherort verwenden.
  • Dies ist kein großartiges VBScript. **Knappheit wurde der Fehlerbehandlung und Vollständigkeit vorgezogen, aber es sollte die Aufgabe mit minimaler Komplexität erfüllen.
  • Die Ausgabedatei wird in dem Ordner erstellt, von dem aus 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 Import ein Komma als Trennzeichen - ODER öffnen Sie die Datei einfach in Notepad oder einem anderen Textprogramm.
  • Das Öffnen in einer Tabellenkalkulation ermöglicht erweiterte Sortierfunktionen.
  • Dieses Skript kann leicht angepasst werden, um eine beträchtliche Anzahl weiterer Details über die MSI-Installation anzuzeigen. Eine Demonstration davon finden Sie hier: https://stackoverflow.com/questions/28963089/how-to-find-out-which-products-are-installed-newer-product-are-already-install/28971679#28971679.
' 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 errors

For Each product In installer.ProductsEx("", "", 7)
   productcode = product.ProductCode
   name = product.InstallProperty("ProductName")
   version=product.InstallProperty("VersionString")
   output.writeline (productcode & ", " & name & ", " & version)
Next

output.Close

Mir fallen im Moment keine weiteren allgemeinen Optionen zum Abrufen von Produktcodes ein, bitte hinzufügen, wenn Sie welche kennen. Einfach inline editieren und nicht zu viele Kommentare hinzufügen, bitte.

Sie können diese Informationen sicherlich von Ihrer Anwendung aus abrufen durch den Aufruf der MSI-Automatisierungsschnittstelle (COM-basiert) ODER der C++ MSI-Installer-Funktionen (Win32-API). Oder verwenden Sie WMI-Abfragen aus Ihrer Anwendung heraus, wie Sie es in den obigen Beispielen mit PowerShell, wbemtest.exe oder WMIExplorer.exe tun.

MSI-Pakete deinstallieren

Wenn Sie das MSI-Paket deinstallieren wollen, für das Sie den Produktcode gefunden haben, können Sie dies wie folgt mit einer erweiterten Eingabeaufforderung tun (suchen Sie nach cmd.exe, klicken Sie mit der rechten Maustaste und als Administrator ausführen): Option 1: Basische, interaktive Deinstallation ohne Protokollierung (schnell und einfach):

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

Schnelle Erläuterung der Parameter:

/X = run uninstall sequence
{00000000-0000-0000-0000-00000000000C} = product code for product to uninstall

Sie können auch die (ausführliche) Protokollierung aktivieren und im stillen Modus ausführen, wenn Sie dies wünschen, 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

Kurze Erläuterung der Parameter:

/X = run uninstall sequence
{00000000-0000-0000-0000-00000000000C} = product code for product to uninstall
/QN = run completely silently
/L*V "C:\My.log"= verbose logging at specified path
REBOOT=ReallySuppress = avoid unexpected, sudden reboot

Eine umfassende Referenz für MSI-Deinstallation gibt es hier (verschiedene Möglichkeiten zur Deinstallation von MSI-Paketen): https://stackoverflow.com/questions/450027/uninstalling-an-msi-file-from-the-command-line-without-using-msiexec/1055933#1055933. Es gibt eine Fülle von verschiedenen Möglichkeiten zur Deinstallation. *Wenn Sie eine Batch-Datei schreiben, werfen Sie bitte einen Blick auf Abschnitt 3 in der oben verlinkten Antwort für einige gängige und Standard-Befehlszeilenvarianten zur Deinstallation. Und ein kurzer Link zu msiexec.exe (Befehlszeilenoptionen) (Übersicht über die Befehlszeile für msiexec.exe von MSDN). Und auch die Technet-Version.

Abrufen anderer MSI-Eigenschaften / Informationen (z.B. Upgrade Code)

UPDATE: hier finden Sie eine neue Antwort auf die Frage, wie man den Upgrade-Code für installierte Pakete findet, anstatt den Code manuell in MSI-Dateien zu suchen. Für

installierte Pakete ist dies viel zuverlässiger. Wenn das Paket nicht installiert ist, müssen Sie immer noch in der MSI-Datei nachsehen (oder in der Quelldatei die zum Kompilieren der MSI-Datei verwendet wurde), um den Upgrade-Code zu finden. Verlassen im älteren Abschnitt unten: Wenn Sie den UpgradeCode oder andere MSI-Eigenschaften erhalten möchten, können Sie die zwischengespeicherte MSI-Installation für das Produkt an dem Ort öffnen, der durch "LocalPackage" in der oben gezeigten Abbildung angegeben ist (etwa so: C:\WINDOWS\Installer\50c080ae.msi- dies ist ein Hex-Dateiname, der auf jedem System eindeutig ist). Dann suchen Sie in der "**Eigenschaftstabelle**" nach UpgradeCode (es ist möglich, dass der UpgradeCode in einer Transformation neu definiert wird - um sicher zu sein, dass Sie den richtigen Wert erhalten, müssen Sie den Code programmatisch vom System abrufen - ich werde in Kürze ein Skript dafür bereitstellen. Allerdings ist **der UpgradeCode in der zwischengespeicherten MSI im Allgemeinen korrekt**). Um die zwischengespeicherten MSI-Dateien zu öffnen, verwenden Sie **[Orca][18]** oder ein anderes Paketierungswerkzeug. Hier finden Sie eine Diskussion über verschiedene Tools (jedes von ihnen ist geeignet): https://stackoverflow.com/questions/1544292/what-installation-product-to-use-installshield-wix-wise-advanced-installer/1546941#1546941. Wenn Sie kein solches Tool installiert haben, versuchen Sie es am besten mit [Super Orca][4] (es ist einfach zu benutzen, wurde aber von mir nicht ausgiebig getestet). **UPDATE**: hier ist eine neue Antwort mit Informationen über verschiedene kostenlose Produkte, die Sie zum Anzeigen von MSI-Dateien verwenden können: https://stackoverflow.com/questions/48482545/how-can-i-compare-the-content-of-two-or-more-msi-files/48482546#48482546 **Wenn Sie Visual Studio installiert haben**, suchen Sie nachOrca-x86_de-us.msi`- unterProgramme (x86)` - und installieren Sie es (dies ist Microsofts eigener, offizieller MSI-Viewer und Editor). Dann finden Sie Orca im Startmenü. Im Handumdrehen geht es los :-). Technisch gesehen wird Orca als Teil von Windows SDK (nicht Visual Studio) installiert, aber Windows SDK ist mit der Visual Studio Installation gebündelt. Wenn Sie Visual Studio nicht installiert haben, kennen Sie vielleicht jemanden, der es hat? Lassen Sie ihn einfach nach diesem MSI suchen und es Ihnen schicken (es ist eine winzige Datei von einem halben MB) - es sollte nur Sekunden dauern. UPDATE: Sie benötigen neben dem MSI auch mehrere CAB-Dateien - diese befinden sich im selben Ordner, in dem sich auch das MSI befindet. Falls nicht, können Sie jederzeit das Windows SDK herunterladen (es ist kostenlos, aber sehr umfangreich - und alles, was Sie installieren, wird Ihren PC verlangsamen). Ich bin mir nicht sicher, welcher Teil des SDKs die Orca MSI installiert. Wenn Sie es wissen, bearbeiten Sie es bitte und fügen Sie hier Details hinzu.

Kommentare (6)

Wenn Sie zu viele Installationsprogramme haben, um das Gesuchte leicht zu finden, können Sie mit der Powershell einen Filter erstellen und die Suche nach dem Anzeigenamen ein wenig einschränken.

$filter = "*core*sdk*"; (Get-ChildItem HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall).Name | % { $path = "Registry::$_"; Get-ItemProperty $path } | Where-Object { $_.DisplayName -like $filter } | Select-Object -Property DisplayName, PsChildName
Kommentare (0)