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.
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):
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
Manche schwören darauf, in der Registry nachzuschauen. Nicht meine empfohlene Vorgehensweise - ich gehe lieber über die richtigen APIs (oder anders gesagt: Funktionsaufrufe des Betriebssystems). Es gibt immer seltsame Ausnahmen, die nur durch die Interna der API-Implementierung erklärt werden können:
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
Sie können den Product Code
in der Property table
jeder MSI-Datei finden (und auch jede andere Eigenschaft). Es ist jedoch denkbar, dass die GUID (in seltenen Fällen) durch eine bei der Installation angewendete Transformation überschrieben wird und daher nicht mit der GUID übereinstimmt, unter der das Produkt registriert ist (die obigen Ansätze 1 und 2 liefern in solchen seltenen Fällen den echten Produktcode, der bei Windows registriert ist).
Sie benötigen ein Tool zum Anzeigen von MSI-Dateien. Am Ende der folgenden Antwort finden Sie eine Liste kostenloser Tools, die Sie herunterladen können (oder siehe die Schnelloption unten): https://stackoverflow.com/questions/48482545/how-can-i-compare-the-content-of-two-or-more-msi-files/48482546#48482546
UPDATE: Der Einfachheit halber und aus Geschwindigkeitsbedürfnis :-), laden Sie SuperOrca ohne Verzögerung und ohne viel Aufhebens von diesem Direktdownload-Hotlink herunter - das Tool ist gut genug, um die Arbeit zu erledigen - installieren Sie es, öffnen Sie die MSI-Datei und gehen Sie direkt zur Eigenschaftstabelle und suchen Sie die Zeile ProductCode
(Bitte überprüfen Sie immer einen Direktdownload-Hotlink auf Viren - natürlich - Sie können virustotal.com verwenden - ein Online-Scan, der Dutzende von Antiviren- und Malware-Suiten verwendet, um zu prüfen, was Sie hochladen).
Orca ist ein Microsoft-eigenes Tool, das mit Visual Studio installiert wird und
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
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.
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).
wbemtest.exe
.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).SELECT IdentifyingNumber,Name,Version FROM Win32_Product
und klicken Sie auf "Verwenden" (oder gleichwertig - das Tool wird lokalisiert).WMIExplorer.exe
ausprobieren.SELECT IdentifyingNumber,Name,Version FROM Win32_Product
und drücken Sie auf Execute.msiinfo.csv
.' 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
oderWMIExplorer.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
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 nach
Orca-x86_de-us.msi`- unter
Programme (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.
Ähnliche Themen (als Referenz und zum leichteren Zugriff - ich sollte diese Liste aufräumen):
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