Cómo encontrar el UpgradeCode y ProductCode de una aplicación instalada en Windows 7

Tengo una aplicación instalada en mi máquina. Yo también dispone de su código fuente, pero de alguna manera el ProductCode y UpgradeCode de esta aplicación se han cambiado.

Ahora quiero conseguir el UpgradeCode y ProductCode de esta aplicación instalada. Siento que debe haber alguna herramienta para esto.

Puede alguien por favor, hágamelo saber cómo obtener la UpgradeCode y ProductCode de una aplicación instalada?

  • ¿Qué lengua es la aplicación desarrollada en?
  • La aplicación es en C#.NET.
InformationsquelleAutor codeLover | 2011-02-21

10 Kommentare

  1. 66

    IMPORTANTE: ha sido un tiempo desde que esta respuesta fue publicado originalmente, y que la gente inteligente se acercó con más sabias respuestas. Compruebe ¿Cómo puedo encontrar el Código de Actualización para instalar un archivo MSI? de @ Stein Åsmul si usted necesita un sólido y amplio enfoque.


    Aquí otra forma (no necesita herramientas):

    • abierto sistema de registro y búsqueda de HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall la clave (si es un instalador de 32 bits en una máquina de 64 bits, puede ser que sea bajo HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall lugar).
    • el Guid enumerados en virtud de que la clave son los productos instalado en esta máquina
    • encontrar el que está hablando, sólo el paso uno por uno hasta que se vea su nombre en el panel de la derecha

    Este GUID usted parado es el Código de producto.

    Ahora, si usted está seguro de que la reinstalación de esta aplicación va a ir bien, puede ejecutar la siguiente línea de comandos:

    msiexec /i {PRODUCTO-CÓDIGO-GUID-AQUÍ}
    REINSTALL=ALL REINSTALLMODE=omus /l*v
    registro.txt

    Esto «reparar» su aplicación. Ahora mira en el archivo de registro y la búsqueda para «UpgradeCode». Este valor es arrojados allí.

    NOTA: sólo debe hacerlo si está seguro de que reinstalar el flujo se implementa correctamente y esto no va a romper su aplicación instalada.

    • +1 para el absurdamente simple manera de encontrar el GUID de un determinado producto! Gracias!
    • Aunque esta es una impresionante solución a la falta de herramientas adecuadas, esto suena como una terrible ejercicio, lleno de posibles fuentes de error. Con Powershell, tenemos mucho mejores formas sin la 3ª parte de las herramientas.
    • De acuerdo, puede agregar los enlaces al principio? EDICIÓN vi tu respuesta
    • Uff, que fue uno incómodo y potencialmente destructiva y peligrosa forma de averiguarlo. Prefiero ir por la no-intrusiva Orca método por @ssdi por debajo de
    • esta secuencia de comandos de PowerShell debe ayudar también scconfigmgr.com/2014/08/22/…
    • Perfecto. La única solución de trabajo
    • Usar PowerShell para obtener un lista completa de actualización de los códigos y códigos de producto junto con la nombre del paquete: ¿Cómo puedo encontrar el Código de Actualización para instalar un archivo MSI?. Esto le dará la real, MSI-valores de base de datos sin ningún tipo de registro manual de búsqueda o entrando necesario.
    • El Uninstall no se encuentra la carpeta en mi registro, alguna idea de por qué?

  2. 18

    Se necesita algún tiempo para volver a resultados, facilidad de muchas decenas de segundos, pero wmic funciona bien y puede ser escrito:

    wmic product where "Name like '%Word%'" get Name, Version, IdentifyingNumber

    resultado:

    IdentifyingNumber                       Name                                      Version
    {90140000-001B-0409-0000-0000000FF1CE}  Microsoft Office Word MUI (English) 2010  14.0.6029.1000

    La IdentifingNumber es el Código de producto. No veo una propiedad para UpgradeCode, pero tal vez podría ser enterrado en algo más. Ver http://quux.wiki.zoho.com/WMIC-Snippets.html para muchos otros ejemplos, incluyendo desinstalar:

    wmic path win32_product where "name = 'HP Software Update'" call Uninstall
  3. 10

    A todo el mundo con:

    Get-WMIObject win32_product

    Usted debe ser consciente de que esto va a ejecutar una auto-curarse en cada uno de los MSI de la aplicación instalada en el PC. Si se va a revisar eventvwr va a decir que ha terminado la reconfiguración de cada producto.

    En este caso yo utilice el siguiente (una mezcla de Yan Sklyarenko del método):

    $Reg = @( "HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*", "HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*" )
    $InstalledApps = Get-ItemProperty $Reg -EA 0
    $WantedApp = $InstalledApps | Where { $_.DisplayName -like "*<part of product>*" }

    Ahora, si usted fuera a tipo:

    $WantedApp.PSChildName

    Sería el siguiente:

    PS D:\SCCM> $WantedApp.PSChildName
    {047904BA-C065-40D5-969A-C7D91CA93D62}

    Si su organización utiliza cargas de MST, mientras que la instalación de aplicaciones que usted quiere evitar la ejecución de la auto-cura encierran vuelven algunos ajustes importantes.

    • Nota – Esta va a encontrar su código de producto, luego de la actualización se puede encontrar como Yan mencionado. Yo normalmente, aunque, sólo el uso de ‘en Lugar de eso!’ o ‘Orca’, a continuación, vaya a la tabla de propiedades de la MSI y se los muestra a la derecha en la parte superior.
    • Un paquete de verificación de la integridad de se ejecuta cuando Win32_Product se accede. Sin la auto-reparación se activará a menos de una fractura de un componente de la ruta de la clave se encuentra en cualquiera de los paquetes MSI. Esta verificación de la integridad de no hacer la recuperación de datos dolorosamente lento, aunque.
  4. 8

    Si usted tiene instalador msi abrirlo con Orca (herramienta de Microsoft), Propiedad de tabla (filas UpgradeCode, Código de producto, versión del Producto, etc) o tabla de Actualización de la columna de Código de Actualización.

    Tratar de encontrar instller a través del registro: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall necesaria subclave y el valor del reloj InstallSource. Tal vez a lo largo de la manera usted será capaz de encontrar el archivo MSI.

  5. 6

    Powershell maneja las tareas de este tipo con bastante facilidad:

    $productCode = (gwmi win32_product | `
                    ? { $_.Name -Like "<PRODUCT NAME HERE>*" } | `
                    % { $_.IdentifyingNumber } | `
                    Select-Object -First 1)

    Usted puede entonces utilizar para obtener la información de desinstalación así:

    $wow = ""
    $is32BitInstaller = $True # or $False
    
    if($is32BitInstaller -and [System.Environment]::Is64BitOperatingSystem) 
    {
        $wow = "\Wow6432Node" 
    }
    
    $regPath = "HKEY_LOCAL_MACHINE\SOFTWARE$wow\Microsoft\Windows\CurrentVersion\Uninstall"
    
    dir "HKLM:\SOFTWARE$wow\Microsoft\Windows\CurrentVersion\Uninstall" | `
    ? { $_.Name -Like "$regPath\$productCode"  }
  6. 3

    En Windows 10 preview build con PowerShell 5, puedo ver que usted puede hacer:

    $info = Get-Package -Name YourInstalledProduct
    $info.Metadata["ProductCode"]

    Que no están familiarizados con, incluso, no estoy seguro si todos los productos que ha UpgradeCode, pero de acuerdo con este post usted necesita para buscar UpgradeCode de esta ruta de acceso del registro:

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UpgradeCodes

    Por desgracia, los valores de clave del registro son el ProductCode y las claves del registro son los UpgradeCode.

    • this post no es una URL válida
  7. 0

    Otra forma demasiado complicada solución, con la ventaja de no tener que volver a instalar la aplicación, ya que la solución anterior se requiere. Esto requiere que usted tenga acceso a la msi (o un setup.exe con el msi embedded).

    Si tienes Visual Studio 2012 (o, posiblemente, de otras ediciones) e instalar gratis «InstallShield LE», entonces usted puede crear un nuevo proyecto de instalación mediante InstallShield.

    Una de las opciones de configuración en el «Organizar su Instalación» es el paso de «las Rutas de Actualización». Abra las propiedades de las Rutas de Actualización, y en el panel de la izquierda a la derecha haga clic en «Rutas de Actualización» y seleccione «Nueva Ruta de Actualización» … ahora vaya a la msi (o setup.exe contiene el msi) y haga clic en «abrir». El código de actualización se rellena en la página de configuración en el panel de la derecha, que ahora debería ver.

  8. 0

    No había encontrado ninguna manera de averiguar el UpgradeCode de una aplicación instalada, antes de ver Yan Sklyarenko‘s solución (actualmente) anterior. Pero si usted o alguien más podría encontrar una manera de encontrar (al menos) tanto UpgradeCode y ProductCode de una MSI, sigue leyendo.

    De http://www.dwarfsoft.com/blog/2010/06/22/msi-package-code-fun/, modificado para permitir (cuando se inicia con wscript.exe) una ventana emergente de información por MSI (Trunicated en 1023 caracteres, debido a wscript.echo limitación); capaces de entrada MSI(s) de la interfaz gráfica de usuario, así como la CLI; algunos humanos básicos de validación de entrada, se quitó el código de depuración (‘ Conjunto de oDatabase) y 1 de corrección del error (DB.OpenView).

    'Created by:   Chris Bennett
    'Created Date: 22/06/2010
    'Description:
    '   Opens up MSI file(s) Passed as Arguments & returns ProductName, ProductCode,
    '   The HKCR key created from ProductCode (a Packed GUID of ProductCode), the 
    '   PackageCode and the UpgradeCode of the MSI. Much quicker than getting these
    '   out of the MSI's the Manual Way.

    Referencias:

    http://msdn.microsoft.com/en-us/library/aa369794%28VS.85%29.aspx
    http://www.eggheadcafe.com/forumarchives/platformsdkmsi/Jan2006/post25948124.asp

    if wscript.arguments.count = 0 then
      MSIs = inputbox("Enter in * delimited list of MSI's to query (Max 254 characters)", "MSI Product Details")
      MSIs = split(MSIs,"*")
    else
      set MSIs = wscript.arguments
    end if
    
    set objFS = createobject("scripting.filesystemobject")
    For Each MSIPath in MSIs
      if objFS.fileexists(MSIPath) then
        Set MSIDetails = EvaluateMSI(MSIPath)
        MSIDetails = MSIPath & ": " & vbcrlf & vbcrlf & "Product Name: " &_
        MSIDetails("ProductName") & vbcrlf & "Product Code: " &_
        MSIDetails("ProductCode") & vbcrlf & "Product Key : " &_
        "HKCR\Installer\Products\" & PackGUID(MSIDetails("ProductCode")) &_
        vbcrlf & "Package Code: " & MSIDetails("PackageCode") & vbcrlf &_
        "Upgrade Code: " & MSIDetails("UpgradeCode") & vbcrlf
        WScript.Echo MSIDetails
      else
        wscript.echo "Inaccessible; Non-existant; or Error in Path for:" & vbcrlf & MSIPath & vbcrlf & "... skipping"
      end if
    Next
    
    Function EvaluateMSI(MSIPath)
      On Error Resume Next
      ' create installer object
      Set oInstaller = CreateObject("WindowsInstaller.Installer")
      ' open msi in read-only mode
      Set oDatabase = oInstaller.OpenDatabase(MSIPath, 0)
      Set objDictionary = CreateObject("Scripting.Dictionary")
      ' Get Package Code from Summary Information Stream   
      Set streamobj = oDatabase.SummaryInformation(0) '0 = read only
      objDictionary("PackageCode") = streamobj.Property(9)
      ' Get Product Name from MSI Database
      Set View = oDatabase.OpenView("Select `Value` From Property WHERE `Property`='ProductName'")
      View.Execute
      Set ProductName = View.Fetch
      objDictionary("ProductName") = ProductName.StringData(1)
    
      ' Get Product Code from MSI Database
      Set View = oDatabase.OpenView("Select `Value` From Property WHERE `Property`='ProductCode'")
      View.Execute
      Set ProductCode = View.Fetch
      objDictionary("ProductCode") = ProductCode.StringData(1)
    
      ' Get Upgrade Code from MSI Database
      Set View = oDatabase.OpenView("Select `Value` From Property WHERE `Property`='UpgradeCode'")
      View.Execute
      Set UpgradeCode = View.Fetch
      objDictionary("UpgradeCode") = UpgradeCode.StringData(1)
    
      Set EvaluateMSI = objDictionary
      On Error Goto 0
    End Function
    
    Function PackGUID(guid)  
      PackGUID = ""  
      '*  
      Dim temp  
      temp = Mid(guid,2,Len(guid)-2)  
      Dim part  
      part = Split(temp,"-")  
      Dim pack  
      pack = ""  
      Dim i, j  
      For i = LBound(part) To UBound(part)
        Select Case i
          Case LBound(part), LBound(part)+1, LBound(part)+2
            For j = Len(part(i)) To 1 Step -1  
              pack = pack & Mid(part(i),j,1)  
            Next  
          Case Else
            For j = 1 To Len(part(i)) Step 2  
              pack = pack & Mid(part(i),j+1,1) & Mid(part(i),j,1)  
          Next  
        End Select
      Next  
      '*  
      PackGUID = pack  
    End Function

    Si uno necesita copy&paste cualquiera de los GUID en la ventana emergente, que tienden a encontrar más fácil el uso de una posterior inputbox, como inputbox "","",MSIDetails

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea