sábado, octubre 22, 2011

Saber el PRODUCTCODE de un instalador usando Batch

despues de algunos meses sin postear escribire algo acerca del PRODUCTOCODE de los paquetes de instalación de windows.



Cuando generamos un instalador de un proyecto hecho en .NET, se genera un paquete con la extension msi. Al generar un instalador podemos indicarle la versión, la ruta donde se intalará, el ProductCode entre otras cosas.



Cada vez que se cambia la version en la capa de instalación de un proyecto en .NET, el entorno hace la siguiente pregunta:






Si le damos click en Sí, el ProductCode cambiará automaticamente.


el productCode de una aplicación .NET es importante a la hora de querer desinstalar una versión antigua o si derrepente se quiere realizar una actualizacion a la versión actual.


Teniendo en claro esto, que pasa si solo se cuenta con el instalador .msi y no se tiene las fuentes o si por ahi se realizó una instalacion con cierta versión y las fuentes originales sufrieron mas cambios de versiones sin haber guardado un historial.


Una solución para saber el ProductCode de un instalador es la siguiente:

Crear el archivo GetMSIProductCode.vbs (la extensión debe ser .vbs) y colocar el siguiente script:





'---------------------------------------------------------------------------------------------


' GetMSIProductCode.vbs

Option Explicit

' Variables
Const msiOpenDatabaseModeReadOnly = 0

' Get command-line arguements
Dim argCount:argCount = Wscript.Arguments.Count

' Connect to the Windows Installer object.
On Error Resume Next
Dim installer : Set installer = Nothing
Set installer = Wscript.CreateObject("WindowsInstaller.Installer") : CheckError

' Open the database (read-only).
Dim databasePath:databasePath = Wscript.Arguments(0)
Dim openMode : openMode = msiOpenDatabaseModeReadOnly
Dim database : Set database = installer.OpenDatabase(databasePath, openMode) : CheckError

' Extract language info and compose report message
Wscript.Echo "Database (MSI) = " & databasePath
Wscript.Echo "ProductName = " & ProductName(database)
Wscript.Echo "ProductCode = " & ProductCode(database)

' Clean up
Set database = nothing
Wscript.Quit 0

' Get the Property.ProductName value.
Function ProductName(database)
On Error Resume Next
Dim view : Set view = database.OpenView("SELECT `Value` FROM `Property` WHERE `Property` = 'ProductName'")
view.Execute : CheckError
Dim record : Set record = view.Fetch : CheckError
If record Is Nothing Then ProductName = "Not specified!" Else ProductName = record.StringData(1)
End Function

' Get the Property.ProductCode value.
Function ProductCode(database)
On Error Resume Next
Dim view : Set view = database.OpenView("SELECT `Value` FROM `Property` WHERE `Property` = 'ProductCode'")
view.Execute : CheckError
Dim record : Set record = view.Fetch : CheckError
If record Is Nothing Then ProductCode = "Not specified!" Else ProductCode = record.StringData(1)
End Function

Sub CheckError
Dim message, errRec
If Err = 0 Then Exit Sub
message = Err.Source & " " & Hex(Err) & ": " & Err.Description
If Not installer Is Nothing Then
Set errRec = installer.LastErrorRecord
If Not errRec Is Nothing Then message = message & vbNewLine & errRec.FormatText
End If
Fail message
End Sub

Sub Fail(message)
Wscript.Echo message
Wscript.Quit 2
End Sub


'---------------------------------------------------------------------------------------------


En el disco “C:\” copiar el instalador .msi del cual se desea saber su ProductCode y además copiamos el archivo GetMSIProductCode.vbs que acabamos de crear

En la ventana de ejecutar colocamos CMD e ingresamos al DOS

Luego, en la ventana de DOS nos situamos en el disco “C:\“ (o en el directorio que elijas pero debes copiar el instalador y el GetMSIProductCode.vbs)

Escribimos el siguiente código:

cscript GetMSIProductCode.vbs "[nombre del instalador].msi"

si el instalador se encuentra en otra ruta debes colocar la dirección completa.

El resultado arrojará el ProductCode en el DOS.

No hay comentarios.: