automation - solucion - Cómo encontrar el Código de actualización y el Código de producto de una aplicación instalada en Windows 7
no se puede procesar la actualizacion xbox 360 solucion (10)
En la compilación de previsualización de Windows 10 con PowerShell 5 , puedo ver que puede hacer:
$info = Get-Package -Name YourInstalledProduct
$info.Metadata["ProductCode"]
No estoy familiarizado, incluso no estoy seguro si todos los productos tienen UpgradeCode, pero según esta publicación necesita buscar UpgradeCode desde esta ruta de registro:
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Installer/UpgradeCodes
Desafortunadamente, los valores clave del registro son el Código del producto y las claves del registro son el Código de actualización.
Tengo una aplicación instalada en mi máquina. También tengo su código fuente, pero de alguna manera el Código de producto y el Código de actualización de esta aplicación fueron modificados.
Ahora quiero obtener UpgradeCode y ProductCode de esta aplicación instalada. Siento que debe haber alguna herramienta para esto.
¿Puede alguien amablemente decirme cómo obtener el Código de actualización y el Código de producto de una aplicación instalada?
Lleva algo de tiempo devolver los resultados, fácilmente muchas decenas de segundos, pero wmic funciona bien y se puede programar:
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
IdentifingNumber
es el ProductCode. No vi una propiedad para UpgradeCode, pero tal vez podría estar enterrado debajo de otra cosa. Consulte http://quux.wiki.zoho.com/WMIC-Snippets.html para ver muchos otros ejemplos, incluida la desinstalación :
wmic path win32_product where "name = ''HP Software Update''" call Uninstall
No había encontrado ninguna forma de averiguar UpgradeCode desde una aplicación instalada, antes de ver la workaround temporal (actualmente) de Yan Sklyarenko . Pero si usted / alguien más encontraría una forma de averiguar (al menos) tanto el Código de actualización como el Código de producto de una MSI, siga leyendo.
De http://www.dwarfsoft.com/blog/2010/06/22/msi-package-code-fun/ , modificado para permitir (cuando se inicia con wscript.exe
) un cuadro emergente de información por MSI (truncado a 1023 chars, debido a la limitación de wscript.echo
); capaz de ingresar MSI (s) desde la GUI y la CLI; alguna validación básica de entrada humana; eliminado el código de depuración (''Establecer oDatabase) y 1 corrección de errores (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 copiar y pegar cualquiera de los GUID''s en la ventana emergente, tiendo a encontrar más fácil usar una siguiente casilla de entrada, como inputbox "","",MSIDetails
Otra solución demasiado complicada, con el beneficio de no tener que volver a instalar la aplicación como lo requería la solución anterior. Esto requiere que tenga acceso al msi (o un setup.exe con el msi incrustado).
Si tiene Visual Studio 2012 (o posiblemente otras ediciones) e instala el "InstallShield LE" gratuito, puede crear un nuevo proyecto de instalación con InstallShield.
Una de las opciones de configuración en el paso "Organizar su configuración" se denomina "Rutas de actualización". Abra las propiedades de las rutas de actualización, y en el panel izquierdo haga clic en "Actualizar rutas" y seleccione "Nueva ruta de actualización" ... ahora busque el msi (o setup.exe que contiene el msi) y haga clic en "abrir". El código de actualización se completará para usted en la página de configuración en el panel derecho que ahora debería ver.
Para todos los que usan:
Get-WMIObject win32_product
Debe tener en cuenta que se ejecutará una auto-sanación en cada aplicación MSI instalada en la PC. Si tuviera que verificar eventvwr, dirá que ha terminado de reconfigurar cada producto.
En este caso, uso lo siguiente (una mezcla del método de Yan Sklyarenko):
$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 fuera a escribir:
$WantedApp.PSChildName
Se le daría lo siguiente:
PS D:/SCCM> $WantedApp.PSChildName
{047904BA-C065-40D5-969A-C7D91CA93D62}
Si su organización utiliza un montón de MST al instalar aplicaciones que le gustaría evitar el autoencaminamiento, revertirán algunas configuraciones cruciales.
- Nota: Encontrará su código de producto, luego la actualización se puede encontrar como mencionó Yan. Por lo general, solo uso "InstEd It!" o ''Orca'' luego ir a la tabla de propiedades de la MSI y los enumera en la parte superior.
Powershell maneja tareas como esta de manera bastante práctica:
$productCode = (gwmi win32_product | `
? { $_.Name -Like "<PRODUCT NAME HERE>*" } | `
% { $_.IdentifyingNumber } | `
Select-Object -First 1)
Luego puede usarlo para obtener la información de desinstalación:
$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" }
Puede usar los métodos MsiEnumProductsEx y MsiGetProductInfoEx para enumerar todas las aplicaciones instaladas en su sistema y MsiGetProductInfoEx los datos a su aplicación
Si no tiene el msi y necesita el código de actualización, en lugar del código del producto, entonces la respuesta está aquí: ¿Cómo puedo encontrar el código de actualización para una aplicación instalada en C #?
Si tiene el instalador msi, ábralo con Orca (herramienta de Microsoft), la propiedad de la tabla (filas Código de actualización, Código de producto, Versión del producto, etc.) o la columna Actualizar la tabla Código de actualización.
Intente encontrar el instalador a través del registro: HKEY_LOCAL_MACHINE / SOFTWARE / Microsoft / Windows / CurrentVersion / Desinstalar buscar la subclave necesaria y ver el valor InstallSource. Quizás en el camino puedas encontrar el archivo MSI.
IMPORTANTE : Ha pasado un tiempo desde que esta respuesta se publicó originalmente, y las personas inteligentes obtuvieron respuestas más acertadas. Comprobar ¿Cómo puedo encontrar el Código de actualización para un archivo MSI instalado? de @ Stein Åsmul si necesita un enfoque sólido e integral.
Aquí hay otra forma (no necesitas ninguna herramienta):
- abrir el registro del sistema y buscar la clave
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Uninstall
(si es un instalador de 32 bits en una máquina de 64 bits, podría estar bajoHKEY_LOCAL_MACHINE/SOFTWARE/Wow6432Node/Microsoft/Windows/CurrentVersion/Uninstall
en lugar). - los GUID enumerados debajo de esa clave son los productos instalados en esta máquina
- encuentre el que está hablando, simplemente paso uno por uno hasta que vea su nombre en el panel derecho
Este GUID al que se detuvo es el ProductCode.
Ahora, si está seguro de que la reinstalación de esta aplicación funcionará bien, puede ejecutar la siguiente línea de comando:
msiexec / i {PRODUCT-CODE-GUID-HERE} REINSTALL = ALL REINSTALLMODE = omus / l * v log.txt
Esto "reparará" tu aplicación. Ahora mira el archivo de registro y busca "UpgradeCode". Este valor se descarga allí.
NOTA: solo debe hacer esto si está seguro de que el flujo de reinstalación se implementó correctamente y esto no interrumpirá su aplicación instalada.