Se puede tener acceso a aplicaciones que están diseñadas para utilizar Windows Installer mediante la clase Win32_Product de WMI, pero actualmente no todas las aplicaciones usan Windows Installer. Dado que Windows Installer proporciona la mayor variedad de técnicas estándar para trabajar con aplicaciones que se pueden instalar, nos centraremos principalmente en este tipo de aplicaciones. Las aplicaciones que utilizan otras rutinas de instalación no se suelen administrar con Windows Installer. Las técnicas concretas para trabajar con estas aplicaciones dependen del software de instalación y de las decisiones que adopte el programador de la aplicación.

Nota:

Las aplicaciones que se instalan con el procedimiento de copiar los archivos de la aplicación en el equipo no se pueden administrar normalmente con las técnicas descritas aquí. Estas aplicaciones se pueden administrar como si fueran archivos y carpetas utilizando las técnicas descritas en la sección "Trabajar con archivos y carpetas".

Mostrar las aplicaciones instaladas con Windows Installer

Para obtener una lista de las aplicaciones instaladas con Windows Installer en un sistema local o remoto, utilice la consulta simple de WMI siguiente:

PS> Get-WmiObject -Class Win32_Product -ComputerName .
IdentifyingNumber : {7131646D-CD3C-40F4-97B9-CD9E4E6262EF}
Name              : Microsoft .NET Framework 2.0
Vendor            : Microsoft Corporation
Version           : 2.0.50727
Caption           : Microsoft .NET Framework 2.0

Para mostrar todas las propiedades del objeto Win32_Product en la presentación, utilice el parámetro Properties de los cmdlets de formato, como el cmdlet Format-List, con el valor * (todo).

PS> Get-WmiObject -Class Win32_Product -ComputerName . | Where-Object -FilterScript {$_.Name -eq "Microsoft .NET Framework 2.0"} | Format-List -Property *
Name              : Microsoft .NET Framework 2.0
Version           : 2.0.50727
InstallState      : 5
Caption           : Microsoft .NET Framework 2.0
Description       : Microsoft .NET Framework 2.0
IdentifyingNumber : {7131646D-CD3C-40F4-97B9-CD9E4E6262EF}
InstallDate       : 20060506
InstallDate2      : 20060506000000.000000-000
InstallLocation   :
PackageCache      : C:\WINDOWS\Installer\619ab2.msi
SKUNumber         :
Vendor            : Microsoft Corporation

También puede utilizar el parámetro Get-WmiObject Filter para seleccionar solamente Microsoft .NET Framework 2.0. Como el filtro utilizado en este comando es un filtro de WMI, utiliza la sintaxis del lenguaje de consultas de WMI (WQL), no la sintaxis de Windows PowerShell. En su lugar:

Get-WmiObject -Class Win32_Product -ComputerName . -Filter "Name='Microsoft .NET Framework 2.0'"| Format-List -Property *

Observe que las consultas de WQL suelen contener caracteres, como espacios o el signo igual, que tienen un significado especial en Windows PowerShell. Por este motivo, es aconsejable especificar siempre el valor del parámetro Filter entre comillas. También se puede usar el carácter de escape de Windows PowerShell, un acento grave (`), aunque no mejore la legibilidad. El comando siguiente equivale al comando anterior y devuelve los mismos resultados, pero utiliza el acento grave para omitir caracteres especiales, en lugar de especificar entre comillas la cadena de filtro completa:

Get-WmiObject -Class Win32_Product -ComputerName . -Filter Name`=`'Microsoft` .NET` Framework` 2.0`' | Format-List -Property *

Si desea obtener una lista sólo de las propiedades que le interesan, utilice el parámetro Property de los cmdlets de formato para enumerar las propiedades deseadas.

Get-WmiObject -Class Win32_Product -ComputerName . | Format-List -Property Name,InstallDate,InstallLocation,PackageCache,Vendor,Version,IdentifyingNumber
...
Name              : HighMAT Extension to Microsoft Windows XP CD Writing Wizard
InstallDate       : 20051022
InstallLocation   : C:\Program Files\HighMAT CD Writing Wizard\
PackageCache      : C:\WINDOWS\Installer\113b54.msi
Vendor            : Microsoft Corporation
Version           : 1.1.1905.1
IdentifyingNumber : {FCE65C4E-B0E8-4FBD-AD16-EDCBE6CD591F}
...

Finalmente, para buscar solamente los nombres de las aplicaciones instaladas, el uso de una simple instrucción Format-Wide simplificará los resultados:

Get-WmiObject -Class Win32_Product -ComputerName .  | Format-Wide -Column 1

Aunque ahora disponemos de varias maneras de examinar las aplicaciones instaladas con Windows Installer, no hemos considerado otras aplicaciones. Puesto que la mayoría de las aplicaciones estándar registran su programa de desinstalación en Windows, podemos trabajar con estos programas localmente buscándolos en el Registro de Windows.

Mostrar todas las aplicaciones que se pueden desinstalar

Aunque no hay manera de garantizar que se pueda encontrar cada aplicación del sistema, se pueden buscar todos los programas que aparecen en el cuadro de diálogo Agregar o quitar programas. Agregar o quitar programas busca estas aplicaciones en la clave del Registro siguiente:

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall.

También podemos examinar esta clave para buscar aplicaciones. Para poder ver más fácilmente la clave Uninstall, podemos asignar una unidad de Windows PowerShell a esta ubicación del Registro:

PS>    

Name       Provider      Root                                   CurrentLocation
----       --------      ----                                   ---------------
Uninstall  Registry      HKEY_LOCAL_MACHINE\SOFTWARE\Micr...
Nota:

La unidad HKLM: está asignada a la raíz de HKEY_LOCAL_MACHINE; por este motivo hemos utilizado esta unidad en la ruta de acceso a la clave Uninstall. En lugar de HKLM: podríamos haber especificado la ruta de acceso al Registro utilizando HKLM o HKEY_LOCAL_MACHINE. La ventaja de usar una unidad del Registro existente es que podemos utilizar el procedimiento para completar con el tabulador para completar los nombres de las claves, de manera que no es necesario escribirlas.

Ahora tenemos una unidad llamada "Uninstall" que podemos usar para buscar aplicaciones instaladas con comodidad y rapidez. Para saber el número de aplicaciones instaladas, puede contar el número de claves del Registro que aparecen en la unidad Uninstall: de Windows PowerShell:

PS> (Get-ChildItem -Path Uninstall:).Count
459

Podemos realizar búsquedas más refinadas en esta lista de aplicaciones mediante el uso de diversas técnicas, empezando por Get-ChildItem. Para obtener una lista de aplicaciones y guardarlas en la variable $UninstallableApplications, utilice el comando siguiente:

$UninstallableApplications = Get-ChildItem -Path Uninstall:
Nota:

Usamos un nombre de variable largo por mayor claridad. En la realidad, no hay ningún motivo para usar nombres largos. Aunque puede usar el procedimiento para completar con el tabulador para los nombres de variables, también puede usar nombres de 1 ó 2 caracteres para ir más rápido. Los nombres descriptivos largos son muy útiles cuando se programa código que se va a volver a utilizar más adelante.

Para mostrar los valores de las entradas del Registro en las claves Uninstall del Registro, utilice el método GetValue de las claves del Registro. El valor del método es el nombre de la entrada del Registro.

Por ejemplo, para buscar los nombres para mostrar de las aplicaciones en la clave Uninstall, use el comando siguiente:

PS> Get-ChildItem -Path Uninstall: | ForEach-Object -Process { $_.GetValue("DisplayName") }

No hay ninguna garantía de que estos valores sean únicos. En el siguiente ejemplo, dos elementos instalados aparecen como "Windows Media Encoder 9 Series":

PS> Get-ChildItem -Path Uninstall: | Where-Object -FilterScript { $_.GetValue("DisplayName") -eq "Windows Media Encoder 9 Series"}


   Hive: Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Micros
oft\Windows\CurrentVersion\Uninstall

SKC  VC Name                           Property
---  -- ----                           --------
  0   3 Windows Media Encoder 9        {DisplayName, DisplayIcon, UninstallS...
  0  24 {E38C00D0-A68B-4318-A8A6-F7... {AuthorizedCDFPrefix, Comments, Conta...

Instalar aplicaciones

La clase Win32_Product permite instalar paquetes de Windows Installer, ya sea de forma remota o local. Si se realiza la instalación remota, se ha de usar una ruta de acceso de red UNC (convención de nomenclatura universal) para especificar la ruta de acceso al paquete .msi, ya que el subsistema WMI no reconoce las rutas de acceso de Windows PowerShell. Por ejemplo, para instalar el paquete NewPackage.msi ubicado en el recurso compartido de red \\AppServ\dsp en el equipo remoto PC01, se ha de escribir el comando siguiente en el símbolo del sistema de Windows PowerShell:

(Get-WMIObject -ComputerName PC01 -List | Where-Object -FilterScript {$_.Name -eq "Win32_Product"}).Install(\\AppSrv\dsp\NewPackage.msi)

Las aplicaciones que no utilizan la tecnología Windows Installer pueden disponer de métodos específicos para la implementación automatizada. Para determinar si hay un método para la implementación automatizada, conviene consultar la documentación de la aplicación o ponerse en contacto con el servicio de soporte técnico del proveedor de la aplicación. En algunos casos, aunque el proveedor no haya diseñado específicamente la aplicación para la instalación automatizada, es posible que el fabricante del software de instalación disponga de técnicas para la automatización.

Eliminar aplicaciones

El procedimiento para quitar un paquete de Windows Installer usando Windows PowerShell es prácticamente el mismo que se utiliza para instalar un paquete. En el siguiente ejemplo, se selecciona el paquete que se va a desinstalar según su nombre; en algunos casos, puede resultar más fácil filtrar con IdentifyingNumber:

(Get-WmiObject -Class Win32_Product -Filter "Name='ILMerge'" -ComputerName . ).Uninstall()

Quitar otras aplicaciones no es sencillo, ni siquiera localmente. Podemos encontrar las cadenas de desinstalación de la línea de comandos correspondientes a estas aplicaciones mediante la extracción de la propiedad UninstallString. Este método se puede usar para aplicaciones instaladas con Windows Installer y para programas antiguos mostrados en la clave Uninstall:

Get-ChildItem -Path Uninstall: | ForEach-Object -Process { $_.GetValue("UninstallString") }

Si lo desea, puede filtrar el resultado por el nombre para mostrar:

Get-ChildItem -Path Uninstall: | Where-Object -FilterScript { $_.GetValue("DisplayName") -like "Win*"} | ForEach-Object -Process { $_.GetValue("UninstallString") }

No obstante, es posible que estas cadenas no se puedan utilizar directamente desde el símbolo del sistema de Windows PowerShell sin alguna modificación.

Actualizar aplicaciones instaladas con Windows Installer

Para actualizar una aplicación, se necesita saber el nombre de la aplicación y la ruta de acceso al paquete de actualización de la aplicación. Disponiendo de esta información, se puede actualizar una aplicación con un único comando de Windows PowerShell:

(Get-WmiObject -Class Win32_Product -ComputerName . -Filter "Name='OldAppName'").Upgrade(\\AppSrv\dsp\OldAppUpgrade.msi)




Tabla de contenido