visual studio microsoft español descargar community powershell wix windows-installer install msiexec uninstall

powershell - microsoft - visual studio installer



¿Cómo puedo encontrar el GUID del producto de una instalación MSI instalada? (2)

Para la recuperación del código de actualización : ¿Cómo puedo encontrar el Código de actualización para un archivo MSI instalado?

Version corta

La información a continuación ha crecido considerablemente con el tiempo y puede haberse vuelto demasiado elaborada. ¿Cómo obtener códigos de producto rápidamente? (cuatro enfoques):

1. Use the Powershell "one-liner"

Desplácese hacia abajo para captura de pantalla y paso a paso . Descargo de responsabilidad también a continuación: riesgos menores o moderados dependiendo de a quién le pregunte. Funciona bien para mi. Cualquier reparación automática activada por esta opción generalmente debería ser posible cancelar. Sin embargo, las comprobaciones de integridad del paquete activadas agregan algún "ruido" en el registro de eventos. Nota ! IdentifyingNumber es el ProductCode (peculiaridad de WMI).

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

Inicio rápido de Powershell : mantenga presionada la tecla de Windows , toque R , escriba "powershell" y presione Entrar

2. Use VBScript

A continuación se describe en " Herramientas alternativas" (sección 3) . Esta opción puede ser más segura que Powershell por las razones que se explican en detalle a continuación. En esencia, es (mucho) más rápido y no es capaz de activar la auto reparación de MSI, ya que no pasa por WMI (accede directamente a la API COM de MSI , a una velocidad vertiginosa). Sin embargo, es más complicado que la opción Powershell (varias líneas de código).

3. Registry Lookup

Algunos juran buscando cosas en el registro. No es mi enfoque recomendado: me gusta pasar por las API adecuadas (o en otras palabras: llamadas a funciones del sistema operativo). Siempre hay excepciones raras explicadas solo por los aspectos internos de la implementación de API:

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

4. Original MSI File / WiX Source

Puede encontrar el Product Code del Product Code en la Property table de Property table de cualquier archivo MSI (y cualquier otra propiedad también). Sin embargo, el GUID podría ser reemplazado (raramente) por una transformación aplicada en el momento de la instalación y, por lo tanto, no coincidir con el GUID en el que está registrado el producto (los enfoques 1 y 2 anteriores informarán el código real del producto, que está registrado con Windows) escenarios raros).

Necesita una herramienta para ver archivos MSI . Consulte en la parte inferior de la siguiente respuesta una lista de herramientas gratuitas que puede descargar (o vea la opción rápida a continuación): ¿Cómo puedo comparar el contenido de dos (o más) archivos MSI?

ACTUALIZACIÓN : para mayor comodidad y necesidad de velocidad :-), descargue SuperOrca sin demora y alboroto desde este SuperOrca directo de descarga directa : la herramienta es lo suficientemente buena como para hacer el trabajo: instalar, abrir MSI e ir directamente a la tabla de propiedades y encontrar el Fila de ProductCode ( por favor, siempre verifique el virus en un ProductCode directo de descarga directa, obviamente , puede usar virustotal.com para hacerlo, escaneo en línea utilizando docenas de conjuntos de antivirus y malware para escanear lo que carga).

Orca es la herramienta propia de Microsoft, se instala con Visual Studio y el SDK de Windows . Intente buscar Orca-x86_en-us.msi - en Program Files (x86) e instale el MSI si lo encuentra.

Y a continuación encontrará la respuesta original que "creció orgánicamente" en muchos detalles.

Tal vez vea la sección " Desinstalar paquetes MSI " a continuación si esta es la tarea que necesita realizar.

Recuperar códigos de producto

ACTUALIZACIÓN : Si también necesita el código de actualización , verifique esta respuesta: ¿Cómo puedo encontrar el Código de actualización para un archivo MSI instalado? (recupera códigos de productos asociados, códigos de actualización y nombres de productos en una salida de tabla, similar a la siguiente).

  • ¿No puedes usar PowerShell? Consulte la sección "Herramientas alternativas" a continuación.
  • Buscando desinstalar? Consulte la sección "Desinstalar paquetes MSI" a continuación.

Encienda Powershell ( mantenga presionada la tecla de Windows, toque R, suelte la tecla de Windows, escriba "powershell" y presione OK ) y ejecute el siguiente comando para obtener una lista de los códigos de producto del paquete MSI instalado junto con la ruta del paquete de caché local y el nombre del producto (maximice la ventana de PowerShell para evitar nombres truncados).

Antes de ejecutar esta línea de comando, lea el descargo de responsabilidad a continuación (nada peligroso, solo algunas posibles molestias). La Sección 3 bajo "Herramientas alternativas" muestra una forma alternativa no WMI de obtener la misma información usando VBScript. Si está intentando desinstalar un paquete, hay una sección a continuación con algunas líneas de comando de msiexec.exe de muestra:

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

El resultado debería ser similar a esto:

¡Nota! Por alguna extraña razón, el "ProductCode" se conoce como "IdentifyingNumber" en WMI. En otras palabras, en la imagen de arriba, el número de identificación es el código de producto.

Si necesita ejecutar esta consulta de forma remota en una gran cantidad de computadoras remotas , consulte la sección " Recuperar códigos de productos de una computadora remota " a continuación.

DESCARGO DE RESPONSABILIDAD (importante, ¡lea antes de ejecutar el comando!): Debido al extraño diseño de Microsoft, cualquier llamada WMI a Win32_Product (como el comando PowerShell a continuación) activará una validación del estado del paquete . Además de ser bastante lento , en casos raros esto puede desencadenar una auto reparación de MSI. Puede ser un paquete pequeño o algo enorme, como Visual Studio. En la mayoría de los casos esto no sucede, pero existe un riesgo. No ejecute este comando justo antes de una reunión importante: nunca es peligroso (es de solo lectura), pero puede ocasionar una reparación prolongada en casos muy raros (creo que también puede cancelar la reparación automática) a menos que el paquete en cuestión lo impida activamente, pero se reiniciará si vuelve a llamar a Win32_Product y esto persistirá hasta que deje que finalice la reparación automática; a veces puede continuar incluso si lo deja terminar: ¿Cómo puedo determinar qué causas se repiten? ¿Autoinstalación de Windows Installer? ).

Y solo para que conste: algunas personas informan que sus registros de eventos se llenan con entradas de MsiInstaller EventID 1035 (vea la respuesta del jefe de código), aparentemente causadas por consultas de WMI a la clase Win32_Product (personalmente nunca he visto esto). Esto no está directamente relacionado con el comando Powershell sugerido anteriormente, está en el contexto del uso general de la clase WIM Win32_Product.

También puede obtener la salida en forma de lista (en lugar de tabla):

get-wmiobject -class Win32_Product

En este caso, el resultado es similar a esto:

Recuperar códigos de producto desde una computadora remota

En teoría, debería poder especificar un nombre de computadora remota como parte del comando en sí. Aquí está el mismo comando que el anterior configurado para ejecutarse en la máquina "RemoteMachine" (se -ComputerName RemoteMachine sección -ComputerName RemoteMachine ):

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

Esto podría funcionar si está ejecutando con derechos de administrador de dominio en un dominio adecuado. En un entorno de grupo de trabajo (oficina pequeña / red doméstica), probablemente tenga que agregar credenciales de usuario directamente a las llamadas de WMI para que funcione.

Además, las conexiones remotas en WMI se ven afectadas (al menos) por el Firewall de Windows , la configuración de DCOM y el Control de cuentas de usuario (UAC) (más cualquier factor adicional que no sea de Microsoft, por ejemplo, firewalls reales , firewall de software de terceros , software de seguridad de varios tipos , etc ...). Si funcionará o no depende de su configuración exacta.

ACTUALIZACIÓN : en esta respuesta se puede encontrar una sección extensa sobre la ejecución remota de WMI: ¿Cómo puedo encontrar el Código de actualización para un archivo MSI instalado? . Parece una regla de firewall y la supresión de la solicitud de UAC a través de un ajuste de registro puede hacer que las cosas funcionen en un entorno de red de grupo de trabajo. No se recomiendan cambios de seguridad, pero funcionó para mí.

Herramientas alternativas

PowerShell requiere que se instale .NET Framework (parece que actualmente está en la versión 3.5.1, octubre de 2017). La aplicación PowerShell en sí misma también puede faltar en la máquina incluso si está instalado .NET. Finalmente, creo que PowerShell puede deshabilitarse o bloquearse mediante diversas políticas y privilegios del sistema.

Si este es el caso, puede probar otras formas de recuperar códigos de productos. Mi alternativa preferida es VBScript : es rápida y flexible (pero también se puede bloquear en ciertas máquinas, y las secuencias de comandos siempre son un poco más complicadas que el uso de herramientas).

  1. Comencemos con una herramienta WMI de Windows wbemtest.exe : wbemtest.exe .

    • Inicie wbemtest.exe ( mantenga presionada la tecla de Windows, toque R, suelte la tecla de Windows, escriba "wbemtest.exe" y presione OK ).
    • Haga clic en conectar y luego en Aceptar (el espacio de nombres predeterminado es root / cimv2) y haga clic en " conectar " nuevamente.
    • Haga clic en " Consulta " y escriba este comando WQL (sabor de SQL): SELECT IdentifyingNumber,Name,Version FROM Win32_Product y haga clic en "Usar" (o equivalente: la herramienta se localizará).
    • Captura de pantalla de salida de muestra (truncada). No es el mejor formato, pero puede obtener los datos que necesita. IdentifyingNumber es el código de producto MSI :

  1. A continuación, puede probar una herramienta WMI personalizada más completa, como WMIExplorer.exe

    • Esto no está incluido en Windows. Sin embargo, es una muy buena herramienta. Recomendado.
    • Compruébalo en: https://github.com/vinaypamnani/wmie2/releases
    • Inicie la herramienta, haga clic en Conectar, haga doble clic en ROOT / CIMV2
    • En la pestaña " Consulta ", escriba la siguiente consulta SELECT IdentifyingNumber,Name,Version FROM Win32_Product y presione Ejecutar.
    • Captura de pantalla omitida, la aplicación requiere demasiado espacio en la pantalla.
  2. Finalmente, puede probar un VBScript para acceder a la información a través de la interfaz de automatización MSI (característica principal de Windows, no está relacionada con WMI ).

    • Copie el siguiente script y péguelo en un archivo * .vbs en su escritorio, e intente ejecutarlo haciendo doble clic. Su escritorio debe poder escribirse para usted, o puede usar cualquier otra ubicación de escritura.
    • Este no es un gran VBScript. Se ha preferido la brevedad sobre el manejo de errores y la integridad, pero debe hacer el trabajo con la mínima complejidad.
    • El archivo de salida se crea en la carpeta desde la que ejecuta el script (la carpeta debe poder escribirse ). El archivo de salida se llama msiinfo.csv .
    • Haga doble clic en el archivo para abrirlo en una aplicación de hoja de cálculo, seleccione una coma como delimitador en la importación, O BIEN, simplemente abra el archivo en el Bloc de notas o en cualquier visor de texto.
    • Abrir en una hoja de cálculo permitirá funciones de clasificación avanzadas.
    • Este script se puede adaptar fácilmente para mostrar una cantidad significativa de más detalles sobre la instalación de MSI . Puede encontrar una demostración de esto aquí: cómo averiguar qué productos están instalados: los productos más nuevos ya están instalados en ventanas MSI .

'' 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

No puedo pensar en ninguna otra opción de propósito general para recuperar códigos de productos en este momento, agregue si conoce alguno. Simplemente edite en línea en lugar de agregar demasiados comentarios, por favor.

Ciertamente puede acceder a esta información desde su aplicación llamando a la interfaz de automatización MSI (basada en COM) O las funciones del instalador MSI C ++ (API Win32). O incluso use consultas WMI desde su aplicación como lo hace en los ejemplos anteriores usando PowerShell , wbemtest.exe o WMIExplorer.exe .

Desinstalar paquetes MSI

Si lo que desea hacer es desinstalar el paquete MSI para el que encontró el código del producto, puede hacerlo de la siguiente manera utilizando un símbolo del sistema elevado (busque cmd.exe , haga clic derecho y ejecútelo como administrador ):

Opción 1 : desinstalación interactiva básica sin registro (rápida y fácil):

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

Explicación rápida de parámetros:

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

También puede habilitar el registro (detallado) y ejecutarlo en modo silencioso si lo desea, lo que nos lleva a la opción 2:

Opción 2 : desinstalación silenciosa con registro detallado (mejor para archivos por lotes):

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

Explicación rápida de parámetros:

/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

Aquí hay una referencia completa para la desinstalación de MSI (varias formas diferentes de desinstalar paquetes MSI): desinstalar un archivo MSI desde la línea de comandos sin usar msiexec . Hay una gran cantidad de formas diferentes de desinstalar.

Si está escribiendo un archivo por lotes, eche un vistazo a la sección 3 en la respuesta anterior vinculada para algunas variantes de línea de comandos de desinstalación comunes y estándar.

Y un enlace rápido a msiexec.exe (opciones de línea de comando) (descripción general de la línea de comando para msiexec.exe de MSDN). Y la versión Technet también.

Recuperación de otras propiedades / información de MSI (f.ex Upgrade Code)

ACTUALIZACIÓN : encuentre una nueva respuesta sobre cómo encontrar el código de actualización para los paquetes instalados en lugar de buscar manualmente el código en archivos MSI. Para los paquetes instalados, esto es mucho más confiable. Si el paquete no está instalado, aún debe buscar en el archivo MSI (o en el archivo fuente utilizado para compilar el MSI) para encontrar el código de actualización. Dejando en la sección anterior a continuación:

Si desea obtener el UpgradeCode u otras propiedades MSI , puede abrir el MSI de instalación en caché para el producto desde la ubicación especificada por " LocalPackage " en la imagen que se muestra arriba (algo así como: C:/WINDOWS/Installer/50c080ae.msi - es un nombre de archivo hexadecimal, único en cada sistema). Luego busca en la " Tabla de propiedades " para UpgradeCode (es posible que el UpgradeCode se redefina en una transformación; para asegurarse de obtener el valor correcto que necesita para recuperar el código programáticamente del sistema, le proporcionaré un script para esto en breve, sin embargo, el UpgradeCode que se encuentra en el MSI en caché es generalmente correcto ).

Para abrir los archivos MSI en caché, use Orca u otra herramienta de empaque. Aquí hay una discusión de diferentes herramientas (cualquiera de ellas servirá): ¿Qué producto de instalación usar? InstallShield, WiX, Wise, instalador avanzado, etc. Si no tiene instalada una herramienta de este tipo, su apuesta más rápida podría ser probar SuperOrca (es fácil de usar, pero no lo he probado exhaustivamente).

ACTUALIZACIÓN : aquí hay una nueva respuesta con información sobre varios productos gratuitos que puede usar para ver archivos MSI: ¿Cómo puedo comparar el contenido de dos (o más) archivos MSI?

Si tiene instalado Visual Studio , intente buscar Orca-x86_en-us.msi , en Program Files (x86) , e instálelo (este es el propio visor y editor oficial de MSI de Microsoft). Luego encuentra Orca en el menú de inicio. Ir tiempo en muy poco tiempo :-). Técnicamente, Orca se instala como parte del SDK de Windows (no Visual Studio), pero el SDK de Windows se incluye con la instalación de Visual Studio. Si no tienes instalado Visual Studio , ¿quizás conoces a alguien que sí? Solo pídales que busquen este MSI y lo envíen (es un pequeño archivo de medio mb), debería tomarles unos segundos. ACTUALIZACIÓN : necesita varios archivos CAB y MSI; estos se encuentran en la misma carpeta donde se encuentra el MSI. De lo contrario, siempre puede descargar el SDK de Windows (es gratuito, pero es grande, y todo lo que instale ralentizará su PC). No estoy seguro de qué parte del SDK instala Orca MSI. Si lo hace, edite y agregue detalles aquí.

Temas similares (para referencia y fácil acceso: debería limpiar esta lista):

Necesito encontrar el GUID del producto para un archivo MSI instalado con el fin de realizar tareas de mantenimiento como patching , uninstall ( cómo desinstalar ) y también para auditing purposes .


Si tiene demasiados instaladores para encontrar lo que está buscando fácilmente, aquí hay algunos PowerShell para proporcionar un filtro y reducirlo un poco por nombre de visualización.

$filter = "*core*sdk*"; (Get-ChildItem HKLM:/SOFTWARE/Microsoft/Windows/CurrentVersion/Uninstall).Name | % { $path = "Registry::$_"; Get-ItemProperty $path } | Where-Object { $_.DisplayName -like $filter } | Select-Object -Property DisplayName, PsChildName