Os aplicativos projetados para usar o Windows Installer podem ser acessados pela classe Win32_Product do WMI, mas nem todos os aplicativos em uso atualmente utilizam o Windows Installer. Como o Windows Installer oferece a maior variedade de técnicas padrão para o trabalho com aplicativos instaláveis, nos concentraremos principalmente nesses aplicativos. Os aplicativos que utilizam rotinas de configuração alternativas geralmente não serão gerenciados pelo Windows Installer. As técnicas específicas para o trabalho com esses aplicativos dependerão do software de instalação e das decisões tomadas pelo seu desenvolvedor.

Observação:

Os aplicativos instalados pela cópia de arquivos para o computador normalmente não podem ser gerenciados com o uso das técnicas discutidas aqui. Você poderá gerenciá-los como arquivos ou pastas usando as técnicas discutidas na seção "Trabalhando com arquivos e pastas".

Listando aplicativos do Windows Installer

Para listar os aplicativos instalados com o Windows Installer em um sistema local ou remoto, use a simples consulta WMI a seguir:

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 exibir todas as propriedades do objeto Win32_Product, use o parâmetro Properties dos cmdlets de formatação, como o cmdlet Format-List, com um valor igual a * (todos).

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

Ou use o parâmetro Get-WmiObject Filter para selecionar apenas o Microsoft .NET Framework 2.0. Como o filtro usado nesse comando é um filtro WMI, ele usa sintaxe de Linguagem WQL (WMI Query Language), não a sintaxe do Windows PowerShell. Como alternativa:

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

Observe que as consultas WQL com frequência utilizam caracteres, como espaços ou sinais de igual, que têm um significado especial no Windows PowerShell. Por esse motivo, é prudente sempre colocar o valor do parâmetro Filter entre aspas. Você também pode usar o caractere de escape do Windows PowerShell, a crase (`), embora ele não melhore a legibilidade. O comando a seguir é equivalente ao anterior e retorna os mesmos resultados, mas utiliza a crase para o escape de caracteres especiais, em vez de colocar toda a cadeia de caracteres do filtro entre aspas.

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

Para listar somente as propriedades que interessam a você, use o parâmetro Property dos cmdlets de formatação para listar as propriedades desejadas.

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 localizar somente os nomes de aplicativos instalados, uma instrução Format-Wide simplifica a saída:

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

Embora agora tenhamos várias maneiras de exibirmos os aplicativos que utilizaram o Windows Installer em sua instalação, não consideramos os outros aplicativos. Como a maioria dos aplicativos padrão registra seu programa de desinstalação no Windows, podemos trabalhar com eles localmente, encontrando-os no Registro do Windows.

Listando todos os aplicativos que não podem ser desinstalados

Embora não haja uma maneira garantida de encontrar todos os aplicativos de um sistema, é possível encontrar todos os programas na lista exibida na caixa de diálogo Adicionar ou remover programas. Com Adicionar ou Remover Programas, esses aplicativos são localizados na seguinte chave do Registro:

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

Também podemos examinar esta chave para localizar aplicativos. Para facilitar a exibição da chave Uninstall, podemos mapear uma unidade do Windows PowerShell para esse local do Registro:

PS>    

Name       Provider      Root                                   CurrentLocation
----       --------      ----                                   ---------------
Uninstall  Registry      HKEY_LOCAL_MACHINE\SOFTWARE\Micr...
Observação:

A unidade HKLM: é mapeada para a raiz de HKEY_LOCAL_MACHINE e, por isso, usamos essa unidade no caminho para a chave Uninstall. Em vez de HKLM: poderíamos ter especificado o caminho do Registro usando HKLM ou HKEY_LOCAL_MACHINE. A vantagem do uso de uma unidade do Registro existente é que podemos usar a expansão de tabulação para preenchermos os nomes das chaves e assim não precisaríamos digitá-los.

Agora temos uma unidade chamada "Uninstall", que pode ser usada para a exibição rápida e conveniente das instalações dos aplicativos. Podemos localizar o número de aplicativos instalados contando o número de chaves do Registro na unidade Uninstall: do Windows PowerShell.

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

Podemos fazer uma busca nessa lista de aplicativos usando várias técnicas, a começar por Get-ChildItem. Para obter uma lista de aplicativos e salvá-los na variável $UninstallableApplications, use o seguinte comando:

$UninstallableApplications = Get-ChildItem -Path Uninstall:
Observação:

Estamos usando um nome muito grande de variável aqui para clareza. Em uma situação real, não há motivo para que os nomes longos sejam usados. Embora você possa usar a expansão de tabulação para os nomes de variáveis, os nomes com 1 ou 2 caracteres também podem ser usados para que tenhamos velocidade. Os nomes descritivos mais longos são mais úteis quando você está desenvolvendo código que será reutilizado.

Para exibir os valores das entradas do Registro nas chaves do Registro em Uninstall, use o método GetValue das chaves do Registro. O valor do método é o nome da entrada do Registro.

Por exemplo, para localizar os nomes para exibição de aplicativos na chave Uninstall, use o seguinte comando:

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

Não há garantias de que esses valores sejam exclusivos. No exemplo a seguir, dois itens instalados aparecem 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...

Instalando aplicativos

Você pode usar a classe Win32_Product para instalar pacotes do Windows Installer, de maneira remota ou local. Em instalações remotas, use um caminho de rede UNC do pacote .msi, porque o subsistema WMI não entende os caminhos do Windows PowerShell. Por exemplo, para instalar o pacote NewPackage.msi localizado no compartilhamento de rede \\AppServ\dsp no computador remoto PC01, digite o seguinte comando no prompt do Windows PowerShell:

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

Os aplicativos que não utilizam a tecnologia do Windows Installer podem ter métodos específicos disponíveis para instalação automatizada. Para descobrir se há um método para a automação da implantação, verifique a documentação do aplicativo ou consulte o sistema de suporte do fornecedor do aplicativo. Em alguns casos, mesmo que o fornecedor do aplicativos não tenha projetado o aplicativo especificamente para a automação da instalação, talvez o fabricante do software de instalação tenha algumas técnicas para a automação.

Removendo aplicativos

A remoção de um pacote do Windows Installer com o uso do Windows PowerShell funciona quase da mesma forma do que a instalação de um pacote. A seguir, é apresentado um exemplo que seleciona o pacote a ser desinstalado com base no nome dele; em alguns casos, talvez seja mais fácil filtrar o IdentifyingNumber:

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

A remoção de outros aplicativos não é tão simples, mesmo quando feita localmente. Podemos localizar as cadeias de caracteres de desinstalação pela linha de comando para esses aplicativos extraindo a propriedade UninstallString. Esse método funciona para os aplicativos do Windows Installer e para os programas mais antigos que aparecem sob a chave Uninstall:

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

Você pode filtrar a saída pelo nome de exibição, se quiser:

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

Entretanto, essas cadeias de caracteres podem não ser diretamente utilizáveis no prompt do Windows PowerShell sem algumas modificações.

Atualizando aplicativos do Windows Installer

Para atualizar um aplicativo, você precisa saber o nome do aplicativo e o caminho para o pacote de atualização do aplicativo. Com essas informações, você pode atualizar um aplicativo com um único comando do Windows PowerShell:

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




Sumário