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)