Come posso trovare il GUID del prodotto di una configurazione MSI installata?

Devo trovare il GUID del prodotto per un file MSI installato per eseguire operazioni di manutenzione come patch, disinstallazione e anche per scopi di controllo.

Versione breve

Le informazioni di seguito sono cresciute considerevolmente nel tempo e potrebbero essere diventate un po ‘troppo elaborate. Come ottenere rapidamente i codici prodotto? (quattro approcci):

1. Usa il “one-liner” di Powershell

Scorri verso il basso per lo screenshot e passo dopo passo . Disclaimer anche di seguito – rischi minori o moderati a seconda di chi chiedi. Funziona OK per me. In genere qualsiasi riparazione automatica triggersta da questa opzione dovrebbe essere ansible annullare. I controlli di integrità del pacchetto triggersti ​​aggiungono tuttavia qualche “registro” del registro eventi. Nota ! IdentifyingNumber è il ProductCode (peculiarità WMI).

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

Avvio rapido di Powershell : tieni premuto il tasto Windows , tocca R , digita “powershell” e premi Invio

2. Usa VBScript

Descritto di seguito in ” Strumenti alternativi” (sezione 3) . Questa opzione potrebbe essere più sicura di PowerShell per ragioni spiegate in dettaglio di seguito. Essenzialmente è (molto) più veloce e non è in grado di innescare l’auto-riparazione di MSI poiché non passa attraverso WMI (accede direttamente all’API MSI COM – a velocità blister). Tuttavia, è più coinvolto dell’opzione PowerShell (diverse linee di codice).

3. Ricerca nel registro

Alcuni giurano guardando le cose nel registro. Non è il mio approccio raccomandato: mi piace passare attraverso le API appropriate (o in altre parole: chiamate alle funzioni del sistema operativo). Ci sono sempre strane eccezioni spiegate solo dai componenti interni dell’implementazione dell’API:

  • HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
  • HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall
  • HKCU\Software\Microsoft\Windows\CurrentVersion\Uninstall

4. File MSI originale / Sorgente WiX

È ansible trovare il Product Code nella Property table di qualsiasi file MSI (e qualsiasi altra proprietà). Tuttavia, il GUID potrebbe essere (raramente) sovrascritto da una trasformazione applicata al momento dell’installazione e quindi non corrisponde al GUID in cui il prodotto è registrato (l’approccio 1 e 2 sopra riporterà il codice del prodotto reale – che è registrato con Windows – in tale scenari rari).

È necessario uno strumento per visualizzare i file MSI . Vedere verso la fine della seguente risposta per un elenco di strumenti gratuiti che è ansible scaricare (o vedere l’opzione rapida sotto): Come posso confrontare il contenuto di due (o più) file MSI?

AGGIORNAMENTO : per comodità e necessità di velocità :-), scarica SuperOrca senza ritardi e confusione da questo hotlink per il download diretto – lo strumento è abbastanza buono per completare il lavoro – installa, apri MSI e vai direttamente alla tabella Proprietà e trova il Riga ProductCode ( controlla sempre un hotlink diretto per il download – ovviamente – puoi usare virustotal.com per farlo – scansione online che utilizza decine di suite antivirus e antimalware per analizzare ciò che carichi).


E sotto troverai la risposta originale che è “cresciuta organicamente” in molti dettagli.

Forse vedi la sezione ” Disinstalla pacchetti MSI ” qui sotto se questa è l’attività che devi eseguire.


Recupera codici prodotto

AGGIORNAMENTO : Se è necessario anche il codice di aggiornamento , controllare questa risposta: Come posso trovare il codice di aggiornamento per un file MSI installato? (recupera codici prodotto associati, codici di aggiornamento e nomi di prodotti in una tabella di output – simile a quello riportato di seguito).

  • Non è ansible utilizzare PowerShell? Vedere la sezione “Strumenti alternativi” di seguito.
  • Stai cercando di disinstallare? Vedi sotto la sezione “Disinstalla pacchetti MSI”.

Accendi Powershell ( tieni premuto il tasto Windows, tocca R, rilascia la chiave di Windows, digita “powershell” e premi OK ) ed esegui il comando seguente per ottenere un elenco dei codici di prodotto del pacchetto MSI installati insieme al percorso del pacchetto cache locale e il nome del prodotto (massimizzare la finestra di PowerShell per evitare nomi troncati).

Prima di eseguire questa riga di comando, leggi la dichiarazione di non responsabilità qui sotto (niente di pericoloso, solo alcuni potenziali fastidi). Sezione 3 in “Strumenti alternativi” mostra un modo alternativo non WMI per ottenere le stesse informazioni usando VBScript. Se si sta tentando di disinstallare un pacchetto, è disponibile una sezione di seguito con alcune linee di comando di esempio msiexec.exe:

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

L’ output dovrebbe essere simile a questo:

inserisci la descrizione dell'immagine qui

Nota! Per qualche strana ragione il “ProductCode” è indicato come “IdentifyingNumber” in WMI. In altre parole, nell’immagine sopra IdentifyingNumber è ProductCode.

Se è necessario eseguire questa query da remoto su molti computer remoti , consultare la sezione ” Recupera codici prodotto da un computer remoto ” di seguito.

DISCLAIMER (importante, si prega di leggere prima di eseguire il comando!): A causa della strana progettazione di Microsoft, qualsiasi chiamata WMI a Win32_Product (come il comando PowerShell di seguito) attiverà una convalida della proprietà del pacchetto . Oltre ad essere piuttosto lento , in casi rari questo può innescare un’autodistruzione da MSI. Questo può essere un piccolo pacchetto o qualcosa di enorme – come Visual Studio. Nella maggior parte dei casi ciò non accade, ma c’è un rischio. Non eseguire questo comando subito prima di un incontro importante: non è mai pericoloso (è di sola lettura), ma in casi molto rari potrebbe portare a una lunga riparazione (penso che si possa anche annullare l’auto-riparazione) a meno che non venga triggersmente impedito dal pacchetto in questione, ma si riavvierà se chiami Win32_Product di nuovo e questo persisterà fino a quando non avrai terminato l’auto-riparazione – a volte potrebbe continuare anche se lo lasci finire: Come posso determinare quali sono le cause ripetute Autoriparazione di Windows Installer? ).

E solo per la cronaca: alcune persone segnalano i loro registri degli eventi riempiendo con le voci 1035 di EventID MsiInstaller (vedi la risposta del capo del codice) – apparentemente causate dalle query WMI alla class Win32_Product (personalmente non l’ho mai visto). Questo non è direttamente correlato al comando PowerShell suggerito sopra, è nel contesto dell’uso generale della class WIM Win32_Product.

È inoltre ansible ottenere l’output in forma di elenco (anziché tabella):

 get-wmiobject -class Win32_Product 

In questo caso l’output è simile a questo:

inserisci la descrizione dell'immagine qui


Recupera codici prodotto da un computer remoto

In teoria dovresti solo essere in grado di specificare un nome di computer remoto come parte del comando stesso. Ecco lo stesso comando di cui sopra impostato per l’esecuzione sulla macchina “RemoteMachine” ( -ComputerName RemoteMachine sezione aggiunta):

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

Questo potrebbe funzionare se stai utilizzando i diritti di amministratore di dominio su un dominio appropriato. In un ambiente di gruppo di lavoro (piccolo ufficio / rete domestica), probabilmente devi aggiungere credenziali utente direttamente alle chiamate WMI per farlo funzionare.

Inoltre, le connessioni remote in WMI sono influenzate da (almeno) Windows Firewall , impostazioni DCOM e Controllo account utente (UAC) (più eventuali fattori aggiuntivi non Microsoft, ad esempio firewall reali , firewall software di terze parti , software di sicurezza di vari generi , ecc …). Se funzionerà o meno dipende dalla tua esatta configurazione.

  • Impostazione di una connessione WMI remota
  • Connessione a WMI in remoto con PowerShell

AGGIORNAMENTO : in questa risposta è disponibile una sezione completa sul WMI remoto in esecuzione: Come posso trovare il codice di aggiornamento per un file MSI installato? . Appare una regola del firewall e la soppressione del prompt UAC tramite un tweak del registro può far funzionare le cose in un ambiente di rete workgroup. I cambiamenti non raccomandati dal punto di vista della sicurezza, ma ha funzionato per me.


Strumenti alternativi

PowerShell richiede l’installazione del framework .NET (attualmente nella versione 3.5.1 sembra? Ottobre 2017). La stessa applicazione PowerShell stessa può anche mancare dalla macchina anche se .NET è installato. Infine, credo che PowerShell possa essere disabilitato o bloccato da vari criteri di sistema e privilegi.

In questo caso, puoi provare altri modi per recuperare i codici prodotto. La mia alternativa preferita è VBScript : è veloce e flessibile (ma può anche essere bloccato su alcune macchine, e lo scripting è sempre un po ‘più complicato rispetto all’utilizzo di strumenti).

  1. Iniziamo con uno strumento WMI Windows wbemtest.exe : wbemtest.exe .

    • Avviare wbemtest.exe ( tenere premuto il tasto Windows, toccare R, rilasciare la chiave di Windows, digitare “wbemtest.exe” e premere OK ).
    • Fare clic su Connetti e quindi su OK (lo spazio dei nomi viene impostato su root \ cimv2) e fare nuovamente clic su ” Connetti “.
    • Fare clic su ” Query ” e digitare questo comando WQL (SQL flavor): SELECT IdentifyingNumber,Name,Version FROM Win32_Product e fare clic su “Use” (o equivalente – lo strumento sarà localizzato).
    • Esempio di schermata di output (troncata). Non è la più bella formattazione, ma puoi ottenere i dati di cui hai bisogno. IdentifyingNumber è il codice prodotto MSI :

Wbemtest.exe

  1. Successivamente, puoi provare uno strumento WMI personalizzato, più completo come WMIExplorer.exe

    • Questo non è incluso in Windows. È uno strumento molto buono, tuttavia. Consigliato.
    • Dai un’occhiata a: https://github.com/vinaypamnani/wmie2/releases
    • Avviare lo strumento, fare clic su Connetti, fare doppio clic su ROOT \ CIMV2
    • Dalla schedaQuery “, digitare la seguente query SELECT IdentifyingNumber,Name,Version FROM Win32_Product e premere Execute.
    • Schermata saltata, l’applicazione richiede troppo spazio sullo schermo.
  2. Infine puoi provare un VBScript per accedere alle informazioni tramite l’interfaccia di automazione MSI (funzionalità di base di Windows – non è correlata a WMI ).

    • Copia lo script seguente e incollalo in un file * .vbs sul desktop e prova a eseguirlo facendo doppio clic. Il tuo desktop deve essere scrivibile per te, oppure puoi usare qualsiasi altra posizione scrivibile.
    • Questo non è un grande VBScript. La precisione è stata preferita rispetto alla gestione degli errori e alla completezza, ma dovrebbe svolgere il lavoro con la minima complessità.
    • Il file di output viene creato nella cartella da cui si esegue lo script (la cartella deve essere scrivibile ). Il file di output si chiama msiinfo.csv .
    • Fai doppio clic sul file per aprirlo in un’applicazione per fogli di calcolo, seleziona la virgola come delimitatore durante l’importazione, OPPURE – apri il file nel Blocco note o in qualsiasi visualizzatore di testo.
    • L’apertura in un foglio di calcolo consente funzionalità di ordinamento avanzate.
    • Questo script può essere facilmente adattato per mostrare una quantità significativa di ulteriori dettagli sull’installazione MSI . Una dimostrazione di questo può essere trovata qui: come scoprire quali prodotti sono installati – i prodotti più recenti sono già installati MSI Windows .
 ' 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 

Non riesco a pensare a ulteriori opzioni generali per recuperare i codici di prodotto al momento, per favore aggiungi se ne conosci qualcuno. Basta modificare in linea anziché aggiungere troppi commenti per favore.

È ansible accedere a queste informazioni dall’interno dell’applicazione richiamando l’interfaccia di automazione MSI (basata su COM) OPPURE le funzioni di installazione MSI C ++ (API Win32). O persino utilizzare le query WMI dall’interno dell’applicazione come negli esempi sopra riportati utilizzando PowerShell , wbemtest.exe o WMIExplorer.exe .


Disinstallare i pacchetti MSI

Se quello che vuoi fare è disinstallare il pacchetto MSI per il quale hai trovato il codice del prodotto, puoi farlo come segue usando un prompt dei comandi con privilegi elevati (cerca cmd.exe , fai clic con il tasto destro ed esegui come amministratore ):

Opzione 1 : Disinstallazione di base e intertriggers senza registrazione (rapida e semplice):

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

Spiegazione rapida dei parametri:

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

Puoi anche abilitare la registrazione (dettagliata) ed eseguire in modalità silenziosa, se vuoi, portandoci all’opzione 2:

Opzione 2 : Disinstallazione invisibile all’utente con registrazione dettagliata (migliore per i file batch):

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

Spiegazione rapida dei parametri:

 /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 

C’è un riferimento completo per la disinstallazione di MSI qui (diversi modi per disinstallare i pacchetti MSI): Disinstallazione di un file MSI dalla riga di comando senza utilizzare msiexec . C’è una pletora di diversi modi per disinstallare.

Se stai scrivendo un file batch, dai un’occhiata alla sezione 3 nella precedente risposta collegata per alcune varianti della riga di comando di disinstallazione comuni e standard.

E un collegamento rapido a msiexec.exe (opzioni della riga di comando) (panoramica della riga di comando per msiexec.exe da MSDN). E anche la versione Technet .


Recupero di altre proprietà / informazioni MSI (f.ex Codice di aggiornamento)

AGGIORNAMENTO : si prega di trovare una nuova risposta su come trovare il codice di aggiornamento per i pacchetti installati invece di cercare manualmente il codice nei file MSI. Per i pacchetti installati questo è molto più affidabile. Se il pacchetto non è installato, è comunque necessario cercare nel file MSI (o nel file di origine utilizzato per compilare l’MSI) per trovare il codice di aggiornamento. Lasciando nella sezione precedente di seguito:

Se si desidera ottenere l’ UpgradeCode o altre proprietà MSI , è ansible aprire l’MSI dell’installazione memorizzata nella cache per il prodotto dalla posizione specificata da ” LocalPackage ” nell’immagine in alto (qualcosa come: C:\WINDOWS\Installer\50c080ae.msi – è un nome di file hex, univoco su ciascun sistema). Quindi guardi nella ” Tabella delle proprietà ” per UpgradeCode (è ansible ridefinire l’UpgradeCode in una trasformazione – per essere sicuro di ottenere il giusto valore necessario per recuperare il codice dal sistema in modo programmatico – Fornirò uno script per questo a breve, tuttavia, il codice di aggiornamento trovato nel file MSI memorizzato nella cache è generalmente corretto ).

Per aprire i file MSI memorizzati nella cache, utilizzare Orca o un altro strumento di packaging. Ecco una discussione di diversi strumenti (ognuno di essi farà): quale prodotto di installazione utilizzare? InstallShield, WiX, Wise, Advanced Installer, ecc . Se non hai installato uno strumento del genere, la tua scommessa più veloce potrebbe essere quella di provare Super Orca (è semplice da usare, ma non ampiamente testato da me).

AGGIORNAMENTO : ecco una nuova risposta con informazioni su vari prodotti gratuiti che è ansible utilizzare per visualizzare i file MSI: Come posso confrontare il contenuto di due (o più) file MSI?

Se hai installato Visual Studio , prova a cercare Orca-x86_en-us.msi – sotto Program Files (x86) – e installalo (questo è il visualizzatore e l’editor MSI di Microsoft). Quindi trova Orca nel menu di avvio. Andare in tempo :-). Tecnicamente Orca è installato come parte di Windows SDK (non Visual Studio), ma Windows SDK è in bundle con l’installazione di Visual Studio. Se non hai installato Visual Studio , forse conosci qualcuno che lo fa? Basta che li cerchino per questo MSI e ti inviino (è un minuscolo mezzo file mb) – dovrebbero impiegarli secondi. AGGIORNAMENTO : sono necessari diversi file CAB e MSI, che si trovano nella stessa cartella in cui si trova MSI. In caso contrario, è sempre ansible scaricare Windows SDK (è gratuito, ma è grande – e tutto ciò che viene installato rallenta il PC). Non sono sicuro di quale parte dell’SDK installi l’MSI di Orca. Se lo fai, per favore basta modificare e aggiungere dettagli qui.


  • Ecco un articolo più completo sul problema della disinstallazione di MSI: Disinstallazione di un file MSI dalla riga di comando senza utilizzare msiexec
  • Ecco un articolo simile con alcune ulteriori opzioni per il recupero delle informazioni MSI utilizzando il registro o il file msi memorizzato nella cache: Trova GUID dal file MSI ?

Argomenti simili (per riferimento e accesso facile – dovrei pulire questo elenco):

  • Come trovare UpgradeCode e ProductCode di un’applicazione installata in Windows 7
  • Come posso trovare il codice di aggiornamento per un’applicazione installata in C #?
  • Wix: come disinstallare un’applicazione installata in precedenza che viene installata utilizzando un programma di installazione diverso
  • WiX: esecuzione di un importante aggiornamento su un’installazione multi-istanza
  • come scoprire quali prodotti sono installati – i prodotti più recenti sono già installati MSI windows (usando VBScript)
  • Come disinstallare con msiexec utilizzando il prodotto id guid senza file .msi presente
  • Trova GUID del pacchetto MSI