Powershell-kontrollera och hitta produktguid för en installerad MSI-installation

för att helt låsa upp det här avsnittet måste du logga in

produktkoden är den unika GUID för att identifiera en applikation eller produktutgåva; med andra ord måste olika versioner och språk av produkten ha olika produktkoder.

Dessutom kan ProductCode användas för att fråga funktionstillstånd och produkttillstånd. Till exempel, installer API ”MsiQueryFeatureStateEx()” och ”MsiQueryProductState ()”, etc.

följande fyra tillvägagångssätt kan ge oss flera metoder för att hitta och hämta (även på distans) GUID för installerade MSI-paket:

använd Powershell ”one-liner”

alla självreparationer som utlöses av detta alternativ bör i allmänhet vara möjliga att avbryta. Paketintegritetskontrollerna som utlöses lägger dock till en händelselogg ”buller”. Ta inte det Identifieranummer är produktkoden (WMI-särdrag).

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

snabbstart av Powershell: håll Windows-tangenten, tryck på R, skriv in ”powershell” och tryck på Enter.

använd VBScript

det här alternativet kan vara säkrare än Powershell av skäl som förklaras i detalj nedan.

i huvudsak är det (mycket) snabbare och kan inte utlösa MSI-självreparation eftersom det inte går igenom WMI (det kommer åt MSI COM API direkt – med blåsningshastighet). Det är dock mer involverat än Powershell-alternativet (flera kodrader).

du kan prova ett VBScript för att komma åt information via MSI automation-gränssnittet (kärnfunktionen i Windows – det är inte relaterat till WMI).

  • kopiera nedanstående skript och klistra in i en *.vbs-fil på skrivbordet och försök att köra den genom att dubbelklicka. Skrivbordet måste vara skrivbart för dig, eller så kan du använda någon annan skrivbar plats.
  • Detta är ett prov VBScript. Terseness har föredragits framför felhantering och fullständighet, men det bör göra jobbet med minimal komplexitet.
  • utdatafilen skapas i mappen där du kör skriptet från (mappen måste vara skrivbar). Utdatafilen heter msiinfo.csv.
  • dubbelklicka på filen för att öppna i ett kalkylprogram, välj kommatecken som avgränsare vid import-eller-bara öppna filen i anteckningsblock eller någon textvisare. Öppning i ett kalkylblad tillåter avancerade sorteringsfunktioner.
  • detta skript kan enkelt anpassas för att visa en betydande mängd ytterligare detaljer om MSI-installationen.
'#### 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

du kan också hitta produktkoden genom att läsa registret från den här basnyckeln: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall.

tryck på F3-tangenten och Sök efter ditt produktnamn. Om det är ett 32-bitars installationsprogram på en 64-bitars maskin kan det vara under följande nyckel: HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall.

följande registernycklar är de vanliga platserna där Sök och hitta guiderna för MSI-paket:

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

Original MSI-fil

du kan hitta produktkoden i egenskapstabellen för alla MSI-filer (och alla andra fastigheter också). GUID kan emellertid tänkas (sällan) åsidosättas av en transformation som tillämpas vid installationstiden och därmed inte matcha GUID som produkten är registrerad under (tillvägagångssätt 1 och 2 ovan kommer att rapportera den verkliga produktkoden – som är registrerad hos Windows – i sådana sällsynta scenarier).

du behöver ett verktyg för att visa MSI-filer. Se längst ner i följande svar för en lista med gratis verktyg du kan ladda ner (eller se snabbalternativ nedan): Hur kan jag jämföra innehållet i två (eller fler) MSI-filer?

för bekvämlighet och need for speed, du kan ladda ner SuperOrca utan dröjsmål och krångel från denna direkt-download hotlink-verktyget är tillräckligt bra för att få jobbet gjort-installera, öppna MSI och gå direkt till egenskapen tabellen och hitta ProductCode raden (Vänligen alltid virus kontrollera en direkt-download hotlink – självklart – du kan använda den här funktionen virustotal.com att göra det-online scan använder dussintals anti-virus och malware sviter att skanna vad du laddar upp).

en annan, den ursprungliga, verktyget Orca är Microsofts eget verktyg, det är installerat med Visual Studio och Windows SDK. Försök söka efter Orca-x86_en-us.msi, under programfiler (x86) och installera MSI om den hittas.

hämta Produktkoder

starta Powershell (håll ner Windows-tangenten, tryck på R, släpp Windows-tangenten, skriv in ”powershell” och tryck på OK) och kör kommandot nedan för att få en lista över installerade MSI-paketproduktkoder tillsammans med den lokala cachepaketvägen och produktnamnet (maximera PowerShell-fönstret för att undvika trunkerade namn).

innan du kör den här kommandoraden, läs ansvarsfriskrivningen nedan (inget farligt, bara några potentiella olägenheter). Om du försöker avinstallera ett paket finns ett avsnitt nedan med några exempel msiexec.exe kommandorader:

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

utgången ska likna detta:

Powershell-kontrollera och hitta produktguid för en installerad MSI-installation

av någon konstig anledning kallas ”Produktkod” som ”Identifieringnummer” i WMI. Så med andra ord, i bilden ovanför Identifieringennummer är produktkoden.

på grund av konstig Microsoft-design kommer alla WMI-samtal till Win32_Product (som PowerShell-kommandot nedan) att utlösa en validering av paketet. Förutom att det är ganska långsamt kan detta i sällsynta fall utlösa en MSI-självreparation. Detta kan vara ett litet paket eller något stort – som Visual Studio. I de flesta fall händer detta inte, men det finns en risk.

kör inte det här kommandot precis före ett viktigt möte, det är aldrig farligt (det är en skrivskyddad fråga), men det kan leda till en lång reparation i mycket sällsynta fall.

du kan också få utmatningen i listform (istället för tabell):

get-wmiobject -class Win32_Product

i detta fall liknar utmatningen detta:

Powershell-kontrollera och hitta produktguid för en installerad MSI-installation

hämta Produktkoder från en fjärrdator

i teorin borde du bara kunna ange ett fjärrdatornamn som en del av själva kommandot. Här är samma kommando som ovan inställd för att köras på maskinen ” RemoteMachine ”(- ComputerName RemoteMachine avsnitt läggas):

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

det här kan fungera om du kör med domänadministratörsrättigheter på en riktig domän. I en arbetsgruppsmiljö (litet kontor / hemnätverk) måste du förmodligen lägga till användaruppgifter direkt till WMI-samtalen för att få det att fungera.

dessutom påverkas fjärranslutningar i WMI av (åtminstone) Windows-brandväggen, DCOM-inställningarna och User Account Control (UAC) (plus eventuella ytterligare faktorer som inte är Microsoft, till exempel ytterligare fysiska eller virtuella brandväggar, brandväggar från tredje part, säkerhetsprogram av olika slag etc.). Om det kommer att fungera eller inte beror vanligtvis på din exakta inställning.

Powershell

PowerShell kräver att. NET framework installeras, men på de flesta moderna operativsystem (Windows Server och Windows-plattformar är Powershell redan inkluderat och tillgängligt). Själva PowerShell-applikationen kan också saknas från maskinen även om. NET är installerat. Slutligen kan PowerShell inaktiveras eller låsas av olika systempolicyer och privilegier.

om så är fallet kan du prova några andra sätt att hämta produktkoder. Ett alternativ är VBScript-det är snabbt och flexibelt (men kan också låsas på vissa maskiner, och skript är alltid lite mer involverat än att använda verktyg).

Låt oss börja med ett inbyggt Windows WMI-verktyg, som vanligtvis används för att testa WMI-komponenter och funktioner: wbemtest.exe.

  • starta wbemtest.exe (håll ner Windows-tangenten, tryck på R, släpp Windows-tangenten, skriv in ” wbemtest.exe ” och tryck på OK).
  • klicka på Anslut och sedan OK (namnrymden är som standard root \ cimv2) och klicka på ”anslut” igen.
  • klicka på ”Query” och skriv in det här WQL-kommandot (SQL-smak): Välj Identifieringnummer,namn,Version från Win32_Product.
  • klicka på ”Använd” (eller motsvarande – verktyget kommer att lokaliseras).

skärmdump för provutmatning är följande. Inte den trevligaste formateringen, men du kan få de data du behöver. Identifieringnummer är MSI-produktkoden:

Powershell-kontrollera och hitta produkten GUID av en installerad MSI setup

därefter kan du prova en anpassad, mer fullfjädrad WMI verktyg som WMIExplorer.exe.

  • detta ingår inte i Windows. Det är dock ett mycket bra verktyg.
  • kolla in det på: https://github.com/vinaypamnani/wmie2/releases.
  • starta verktyget, klicka på Anslut, dubbelklicka på ROOT \ CIMV2
  • från fliken ”fråga”, skriv in följande fråga välj Identifieringnummer,namn,Version från Win32_Product och tryck på Execute.

hämta MSI-paket GUID (jämför produktkod och UpgradeCode)

starta PowerShell: håll ner Windows och R-tangenten tillsammans, släpp Windows-tangenten, skriv in ”powershell” och tryck på OK eller tryck på Enter.

kopiera skriptet nedan i sin helhet och högerklicka bara inuti PowerShell-fönstret.

för Win32_Property filtrerar vi både rader och kolumner (UpgradeCode är bara en av många radtyper). Var beredd på en långsam operation, WMI är mycket långsam att göra sådana hämtningar.

$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"

uppgraderingskoden är den unika GUID för att identifiera en familj av en produkt. Det vill säga samma produkter med olika versioner har förmodligen skickats för några utgåvor. Dessa produkter har olika ProductCodes, men de är sammanlänkade genom att använda samma UpgradeCode.

till exempel, förutsatt att vi skrev en produkt som heter ”Happy MSI” och den här produkten har bara ett MSI-paket för distribution på klientsystemet.

den första utgåvan av denna produkt är faktiskt MSI-paketet med namnet ” version_1.msi”, och den andra utgåvan är ” version_2.msi”. Sedan måste dessa två MSI ha samma UpgradeCode. När användare kör ” version_2.msi ” på deras system kommer windows installer att använda UpgradeCode för att avgöra om tidigare versioner av den här produkten redan finns på systemet.

Installer API ”MsiEnumRelatedProducts ()” använder UpgradeCode för att fråga alla familjeprodukter.

Avinstallera MSI-paket

om det du vill göra är att avinstallera MSI-paketet och du hittade produktkoden (GUID) för, kan du göra det enligt följande med en upphöjd kommandotolk (Sök efter cmd.exe, högerklicka och kör som admin):

alternativ 1: Grundläggande, interaktiv avinstallation utan loggning (snabbt och enkelt):

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

snabb Parameter förklaring:

  • /X = kör avinstallationssekvens
  • {00000000-0000-0000-0000000000c} = Produktkod för produkt att avinstallera

du kan också aktivera (verbose) loggning och köra i tyst läge om du vill, vilket leder oss till alternativ 2:

alternativ 2: tyst avinstallera med verbose loggning (bättre för batchfiler):

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

snabb Parameter förklaring:

  • /X = kör avinstallationssekvens
  • {00000000-0000-0000-0000-000000000000c} = Produktkod för produkt att avinstallera
  • /QN = Kör helt tyst
  • /L*V ”C:\My.log ” = Verbose loggning på angiven sökväg
  • REBOOT=ReallySuppress = Undvik oväntad, plötslig omstart

Leave a Reply

Din e-postadress kommer inte publiceras.