Ich brauche das finden Produkte GUID für eine installierte MSI - Datei , um Wartungsarbeiten durchzuführen, wie patching
, uninstall
( wie-zu deinstallieren ) und auch für auditing purposes
.
Ich brauche das finden Produkte GUID für eine installierte MSI - Datei , um Wartungsarbeiten durchzuführen, wie patching
, uninstall
( wie-zu deinstallieren ) und auch für auditing purposes
.
Antworten:
Zum Abrufen des Upgrade-Codes : Wie finde ich den Upgrade-Code für eine installierte MSI-Datei?
Die folgenden Informationen sind im Laufe der Zeit erheblich gewachsen und möglicherweise etwas zu ausführlich geworden. Wie bekomme ich schnell Produktcodes? (vier Ansätze):
Use the Powershell "one-liner"
Scrollen Sie nach unten für Screenshot und Schritt für Schritt . Haftungsausschluss auch unten - geringfügige oder mäßige Risiken, je nachdem, wen Sie fragen. Funktioniert für mich in Ordnung. Jede durch diese Option ausgelöste Selbstreparatur sollte generell abgebrochen werden können. Die Paketintegritätsprüfungen ausgelöst hat einige Ereignisprotokoll „Rauschen“ hinzufügen though. Hinweis ! IdentifyingNumber
ist die ProductCode
(WMI-Besonderheit).
get-wmiobject Win32_Product | Format-Table IdentifyingNumber, Name, LocalPackage -AutoSize
Schnellstart von Powershell : Halten Windows key, tippen R, "Powershell" eingeben und drückenEnter
Use VBScript
( Skript auf github.com )Wird unten unter " Alternative Tools" (Abschnitt 3) beschrieben . Diese Option ist aus den nachstehend ausführlich erläuterten Gründen möglicherweise sicherer als Powershell. Im Wesentlichen ist es (viel) schneller und kann keine MSI-Selbstreparatur auslösen, da es nicht über WMI läuft (es greift direkt auf die MSI-COM-API zu - mit rasender Geschwindigkeit). Es ist jedoch aufwändiger als die Powershell-Option (mehrere Codezeilen).
Registry Lookup
Einige schwören darauf, Dinge in der Registrierung nachzuschlagen. Nicht mein empfohlener Ansatz - ich gehe gerne die richtigen APIs durch (oder mit anderen Worten: Betriebssystemfunktionsaufrufe). Es gibt immer seltsame Ausnahmen, die nur von den Interna der API-Implementierung berücksichtigt werden:
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall
HKCU\Software\Microsoft\Windows\CurrentVersion\Uninstall
Original MSI File / WiX Source
Sie finden die Product Code
in Property table
jeder MSI-Datei (und auch in jeder anderen Eigenschaft). Es ist jedoch denkbar, dass die GUID (selten) durch eine zum Zeitpunkt der Installation angewendete Transformation überschrieben wird und daher nicht mit der GUID übereinstimmt, unter der das Produkt registriert ist (Ansatz 1 und 2 oben geben den tatsächlichen Produktcode an, der bei Windows registriert ist) seltene Szenarien).
Sie benötigen ein Tool zum Anzeigen von MSI-Dateien . Unten in der folgenden Antwort finden Sie eine Liste der kostenlosen Tools, die Sie herunterladen können (oder die unten stehende Kurzoption): Wie kann ich den Inhalt von zwei (oder mehr) MSI-Dateien vergleichen?
UPDATE : Laden Sie SuperOrca aus Bequemlichkeits- und Geschwindigkeitsgründen unverzüglich von diesem Direkt-Download-Hotlink herunter - das Tool ist gut genug, um die Aufgabe zu erledigen - installieren, öffnen Sie MSI und gehen Sie direkt zur Eigenschaftentabelle und suchen Sie die Zeile ( Bitte überprüfen Sie immer einen Hotlink zum direkten Herunterladen von Viren - natürlich - Sie können dazu virustotal.com verwenden - Online-Scan mit Dutzenden von Antiviren- und Malware-Suiten, um zu scannen, was Sie hochladen).ProductCode
Orca ist ein Microsoft-eigenes Tool, das mit Visual Studio und dem Windows SDK installiert wird . Suchen Sie nach
Orca-x86_en-us.msi
- unterProgram Files (x86)
und installieren Sie das MSI, falls es gefunden wurde.
- Aktueller Pfad :
C:\Program Files (x86)\Windows Kits\10\bin\10.0.17763.0\x86
- Ändern Sie die Versionsnummern entsprechend
Und unten finden Sie die ursprüngliche Antwort, die "organisch gewachsen" ist, sehr detailliert.
Lesen Sie möglicherweise den Abschnitt " MSI-Pakete deinstallieren " weiter unten, wenn dies die Aufgabe ist, die Sie ausführen müssen.
UPDATE : Wenn Sie auch den Upgrade-Code benötigen , überprüfen Sie diese Antwort: Wie finde ich den Upgrade-Code für eine installierte MSI-Datei? (Ruft die zugehörigen Produktcodes, Upgrade-Codes und Produktnamen in einer Tabellenausgabe ab - ähnlich der folgenden).
- Kann PowerShell nicht verwenden? Siehe Abschnitt "Alternative Tools" weiter unten.
- Möchten Sie deinstallieren? Siehe den Abschnitt "MSI-Pakete deinstallieren" weiter unten.
Feuer Powershell ( halten Sie die Windows - Taste, tippen R, lassen Sie die Windows - Taste, geben Sie in „Powershell“ und drücken Sie OK ) und führen Sie den folgenden Befehl ein , um eine Liste der installierten MSI - Paket Produktcodes zusammen mit dem lokalen Cache Paketpfad und den Produktnamen (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 mögliche Belästigungen). Abschnitt 3 unter "Alternative Tools" zeigt eine alternative Nicht-WMI-Methode, um dieselben Informationen mit VBScript abzurufen. Wenn Sie versuchen, ein Paket zu deinstallieren, finden Sie unten einen Abschnitt mit einigen Beispielbefehlszeilen für msiexec.exe:
get-wmiobject Win32_Product | Format-Table IdentifyingNumber, Name, LocalPackage -AutoSize
Die Ausgabe sollte ungefähr so aussehen:
Hinweis! Aus irgendeinem seltsamen Grund wird der "ProductCode " in WMI als "IdentifyingNumber" bezeichnet . Also mit anderen Worten - auf dem Bild über dem IdentifyingNumber ist der Productcode .
Wenn Sie diese Abfrage remote für viele Remotecomputer ausführen müssen, lesen Sie den folgenden Abschnitt " Abrufen von Produktcodes von einem Remotecomputer ".
HAFTUNGSAUSSCHLUSS (wichtig, bitte lesen Sie, bevor Sie den Befehl ausführen !): Aufgrund des seltsamen Microsoft-Designs
Win32_Product
löst jeder WMI-Aufruf von (wie der PowerShell-Befehl unten) eine Validierung des Paketbestandes aus . Dies ist nicht nur recht langsam , sondern kann in seltenen Fällen auch eine MSI-Selbstreparatur auslösen. Dies kann ein kleines Paket oder etwas Großes sein - wie Visual Studio. In den meisten Fällen passiert dies nicht - aber es besteht ein Risiko. Führen Sie diesen Befehl nicht direkt vor einem wichtigen Meeting aus - er ist niemals gefährlich (er ist schreibgeschützt), kann jedoch in sehr seltenen Fällen zu einer langen Reparatur führen(Ich denke, Sie können die Selbstreparatur auch abbrechen - es sei denn, das betreffende Paket verhindert dies aktiv. Sie wird jedoch neu gestartet, wenn Sie Win32_Product erneut aufrufen, und dies bleibt bestehen, bis Sie die Selbstreparatur abgeschlossen haben. Manchmal wird sie auch dann fortgesetzt, wenn Sie lassen es zu Ende gehen: Wie kann ich feststellen, was die wiederholte Selbstreparatur von Windows Installer verursacht? ).Und nur zur Veranschaulichung : Einige Leute melden ihre Ereignisprotokolle mit MsiInstaller EventID 1035-Einträgen (siehe Antwort des Codechefs) - anscheinend verursacht durch WMI-Abfragen an die Win32_Product-Klasse (persönlich habe ich das noch nie gesehen). Dies steht nicht in direktem Zusammenhang mit dem oben vorgeschlagenen Powershell-Befehl, sondern steht im Zusammenhang mit der allgemeinen Verwendung der WIM-Klasse Win32_Product.
Sie können die Ausgabe auch in Listenform (anstelle der Tabelle) erhalten:
get-wmiobject -class Win32_Product
In diesem Fall ist die Ausgabe ähnlich wie folgt:
Theoretisch sollten Sie nur einen Remotecomputernamen als Teil des Befehls selbst angeben können. Hier ist der gleiche Befehl wie oben, der für die Ausführung auf dem Computer "RemoteMachine" eingerichtet wurde ( -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 für eine ordnungsgemäße 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 werden Remoteverbindungen in WMI (zumindest) von der Windows-Firewall , den DCOM-Einstellungen und der Benutzerkontensteuerung (User Account Control, UAC) (sowie allen zusätzlichen Nicht-Microsoft-Faktoren - beispielsweise echten Firewalls , Software-Firewalls von Drittanbietern und Sicherheitssoftware verschiedener Art - beeinflusst Arten , etc ...). Ob es funktioniert oder nicht, hängt von Ihrem genauen Setup ab.
UPDATE : In dieser Antwort finden Sie einen ausführlichen Abschnitt zum Ausführen von Remote-WMI: Wie finde ich den Upgrade-Code für eine installierte MSI-Datei? . Es scheint, dass eine Firewall-Regel und die Unterdrückung der UAC-Eingabeaufforderung durch eine Registrierungsoptimierung dazu führen kann, dass Dinge in einer Arbeitsgruppen-Netzwerkumgebung funktionieren. Nicht empfohlene Änderungen in Bezug auf die Sicherheit, aber es hat bei mir funktioniert.
Für PowerShell muss das .NET Framework installiert sein (derzeit in Version 3.5.1, wie es scheint? Oktober 2017). Die eigentliche PowerShell-Anwendung selbst kann auch dann auf dem Computer fehlen , wenn .NET installiert ist. Schließlich glaube ich, dass PowerShell durch verschiedene Systemrichtlinien und -berechtigungen deaktiviert oder gesperrt werden kann.
In diesem Fall können Sie verschiedene andere Methoden ausprobieren, um Produktcodes abzurufen. Meine bevorzugte Alternative ist VBScript - es ist schnell und flexibel (kann aber auch auf bestimmten Computern gesperrt werden, und die Skripterstellung ist immer etwas 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
SELECT IdentifyingNumber,Name,Version FROM Win32_Product
und drücken Sie Ausführen.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
Ich kann mir derzeit keine weiteren allgemeinen Optionen zum Abrufen von Produktcodes vorstellen. Fügen Sie diese bitte hinzu, wenn Sie welche kennen. Bearbeiten Sie einfach inline, anstatt zu viele Kommentare hinzuzufügen.
Sie können auf diese Informationen in Ihrer Anwendung zugreifen, indem Sie die MSI-Automatisierungsschnittstelle (COM-basiert) ODER die C ++ MSI-Installationsfunktionen (Win32-API) aufrufen . Oder auch WMI - Abfragen verwenden aus Ihrer Anwendung , wie Sie in den Proben oben mit zu tun
PowerShell
,wbemtest.exe
oderWMIExplorer.exe
.
Wenn Sie das MSI-Paket deinstallieren möchten, für das Sie den Produktcode gefunden haben, können Sie dies über eine Eingabeaufforderung mit erhöhten Rechten wie folgt tun (nach cmd.exe suchen , mit der rechten Maustaste klicken und als Administrator ausführen ):
Option 1 : Grundlegende interaktive Deinstallation ohne Protokollierung (schnell und einfach):
msiexec.exe /x {00000000-0000-0000-0000-00000000000C}
Kurze Parametererklärung:
/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 unbeaufsichtigten Modus ausführen, wenn Sie möchten. Dies führt uns zu Option 2:
Option 2 : Stille Deinstallation mit ausführlicher Protokollierung (besser für Batchdateien):
msiexec.exe /x {00000000-0000-0000-0000-00000000000C} /QN /L*V "C:\My.log" REBOOT=ReallySuppress
Kurze Parametererklärung:
/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
Hier finden Sie eine umfassende Referenz zur Deinstallation von MSI (verschiedene Möglichkeiten zum Deinstallieren von MSI-Paketen): Deinstallieren einer MSI-Datei über die Befehlszeile ohne Verwendung von msiexec . Es gibt eine Vielzahl verschiedener Möglichkeiten zur Deinstallation.
Wenn Sie eine Batch-Datei schreiben, lesen Sie bitte Abschnitt 3 in der obigen, verknüpften Antwort für einige gängige und standardmäßige Deinstallationsbefehlszeilenvarianten.
Und ein schneller Link zu msiexec.exe (Befehlszeilenoptionen) (Übersicht über die Befehlszeile für msiexec.exe von MSDN). Und die Technet-Version auch.
UPDATE : Hier finden Sie eine neue Antwort, wie Sie den Upgrade-Code für installierte Pakete finden, anstatt den Code in MSI-Dateien manuell nachzuschlagen. Für installierte Pakete ist dies viel zuverlässiger. Wenn das Paket nicht installiert ist, müssen Sie weiterhin in der MSI-Datei (oder der Quelldatei, die zum Kompilieren der MSI verwendet wird) nach dem Upgrade-Code suchen. Verlassen Sie den älteren Abschnitt unten:
Wenn Sie den UpgradeCode oder andere MSI-Eigenschaften erhalten möchten , können Sie die zwischengespeicherte Installations-MSI für das Produkt an dem in der obigen Abbildung durch " LocalPackage " angegebenen Speicherort öffnen (z. B .: C:\WINDOWS\Installer\50c080ae.msi
- Es handelt sich um einen Hex-Dateinamen, der jeweils eindeutig ist System). Dann suchen Sie in der " Eigenschaftstabelle " nach UpgradeCode (es ist möglich, dass der UpgradeCode in einer Transformation neu definiert wird - um sicherzugehen, dass Sie den richtigen Wert erhalten, den Sie benötigen, um den Code programmgesteuert vom System abzurufen -, werde ich ein Skript für bereitstellen Dies ist in Kürze der Fall . Der im zwischengespeicherten MSI gefundene UpgradeCode ist jedoch im Allgemeinen korrekt .
Verwenden Sie Orca oder ein anderes Verpackungstool, um die zwischengespeicherten MSI-Dateien zu öffnen . Hier finden Sie eine Diskussion der verschiedenen Tools (eines davon reicht aus): Welches Installationsprodukt soll verwendet werden? Installshield, WiX, Wise, Advanced Installer, etc . Wenn Sie ein solches Tool nicht installiert haben, ist es möglicherweise am schnellsten, Super Orca auszuprobieren (es ist einfach zu verwenden, aber von mir nicht ausführlich getestet).
UPDATE : Hier ist eine neue Antwort mit Informationen zu verschiedenen kostenlosen Produkten, mit denen Sie MSI-Dateien anzeigen können: Wie kann ich den Inhalt von zwei (oder mehr) MSI-Dateien vergleichen?
Wenn Sie Visual Studio installiert haben , suchen Sie nach Orca-x86_en-us.msi
- unter Program Files (x86)
- und installieren Sie es (dies ist Microsofts eigener, offizieller MSI-Viewer und -Editor). Dann finden Sie Orca im Startmenü. Geh in kürzester Zeit :-). Technisch gesehen wird Orca als Teil des Windows SDK (nicht Visual Studio) installiert, aber Windows SDK wird mit der Visual Studio-Installation gebündelt. Wenn Sie Visual Studio nicht installiert haben , kennen Sie vielleicht jemanden, der dies tut? Lassen Sie sie einfach nach diesem MSI suchen und senden Sie es (es ist eine winzige halbe MB-Datei) - sollte sie Sekunden dauern. UPDATE : Sie benötigen mehrere CAB-Dateien sowie die MSI - diese befinden sich in demselben Ordner, in dem sich die MSI befindet. Wenn nicht, können Sie das Windows SDK jederzeit herunterladen(Es ist kostenlos, aber groß - und alles, was Sie installieren, verlangsamt Ihren PC). Ich bin nicht sicher, welcher Teil des SDK das Orca MSI installiert. Wenn Sie dies tun, bearbeiten Sie diese einfach und fügen Sie hier Details hinzu.
Ähnliche Themen (als Referenz und einfacher Zugriff - ich sollte diese Liste bereinigen):
Win32_Product
sollte wirklich nicht abgefragt werden, da es sich nicht um eine schreibgeschützte Operation handelt. Anscheinend führt es eine Konsistenzprüfung für jedes Paket durch und fährt dann mit Reparaturinstallationen fort, falls welche gefunden werden. Siehe sdmsoftware.com/group-policy-blog/wmi/… und support.microsoft.com/kb/974524
Win32_Product
wird nur aufgerufen, weil der UpgradeCode auf andere Weise nicht leicht zugänglich ist. Hier wird ein anderer Weg beschrieben , der jedoch auch einige unangenehme Aspekte aufweist (MSI-API-Sitzungsobjekte).
Wenn Sie zu viele Installationsprogramme haben, um das Gesuchte leicht zu finden, finden Sie hier eine PowerShell, mit der Sie einen Filter bereitstellen und ihn nach Anzeigenamen eingrenzen können.
$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
Es gibt auch ein sehr hilfreiches GUI-Tool namens Produktbrowser, das anscheinend von Microsoft oder zumindest einem Mitarbeiter von Microsoft erstellt wurde.
Es kann auf Github hier Produktbrowser gefunden werden
Ich persönlich hatte es sehr leicht, die GUID zu finden, die ich damit brauchte.