Como obter uma lista de todos os softwares instalados do PowerShell

Última atualização: 16/10/2025
autor: Isaac
  • O Registro (chaves de desinstalação) é a fonte mais confiável para o que “Adicionar ou Remover Programas” exibe.
  • O Win32_Product funciona para MSIs, mas é lento e pode causar reparos; use com cautela.
  • Get-Package lista pacotes do PackageManagement (PowerShellGet/NuGet), não todos os softwares do sistema.
  • Exporte e compare com TXT/CSV e Compare-Object; Geek Uninstaller e UninstallView simplificam os relatórios.

Listar software instalado com PowerShell

Se você já precisou descobrir rapidamente quais programas estão instalados em um computador Windows , seja porque administra servidores sem interface gráfica ou porque está prestes a reinstalar o sistema, você vai querer um inventário confiável. Este artigo explicará, em detalhes e passo a passo, todas as maneiras de listar e exportar o software instalado usando PowerShell , WMI, o Registro e ferramentas de terceiros.

Vamos integrar diversas técnicas comprovadas, discutindo seus prós e contras, e você verá desde comandos diretos até opções avançadas como Get-Package com PackageManagement, consultas ao Registro (Desinstalar), execução remota e até comparações entre listagens antes e depois da formatação . Também adicionaremos opções de exportação para TXT/CSV/HTML e, para quem preferir, utilitários de terceiros que fazem isso com apenas alguns cliques.

Por que vale a pena listar seus programas

Manter um inventário organizado evita que você se esqueça de reinstalar programas e ajuda a identificar softwares que não usa mais. Muitos computadores acumulam aplicativos que nunca são testados, acabam esquecidos e ocupam espaço, e pior ainda, alguns permanecem rodando em segundo plano, consumindo recursos sem que você perceba.

Uma lista permite que você revise tudo rapidamente, o que é melhor do que navegar pela interface "Aplicativos e recursos". Ela também simplifica as tarefas de suporte, auditoria e conformidade, além de economizar tempo se você gerencia vários PCs ou servidores Windows Core onde não há interface gráfica e tudo é feito pela linha de comando.

Essas técnicas funcionam em diversas versões do Windows, incluindo Windows Server 2012 R2, 2016, 2019 e Windows 7/10/11 , com nuances que discutiremos conforme necessário.

Mais adiante, você verá que nem todos os métodos mostram a mesma coisa: PowerShell, WMI, o Registro e o Gerenciamento de Pacotes consultam fontes diferentes, portanto, é importante saber o que cada técnica abrange e suas limitações para escolher a mais adequada em cada caso.

Lista de programas instalados do PowerShell

Métodos rápidos do PowerShell para visualizar programas instalados

O PowerShell oferece maneiras diretas de gerar uma lista. Vamos começar com a mais imediata: verificar as chaves de desinstalação do Registro , que são o que realmente alimenta a clássica visualização "Adicionar ou Remover Programas".

O alias `gp` (Get-ItemProperty) permite ler propriedades rapidamente. Você pode combinar dois caminhos (64 e 32 bits) e filtrar itens com nomes visíveis.

gp HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*, HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | Where-Object { -not ::IsNullOrWhiteSpace($_.DisplayName) } | Select-Object DisplayName

Se preferir algo mais estruturado (nome, versão, editora, data), separe por arquitetura e formate em uma tabela compacta para revisão na tela; funciona muito bem para leitura rápida.

# 64 bits
Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Select-Object DisplayName, DisplayVersion, Publisher, InstallDate | Format-Table -AutoSize

# 32 bits
Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | Select-Object DisplayName, DisplayVersion, Publisher, InstallDate | Format-Table -AutoSize

Existe também o método WMI/WMIC para localizar softwares instalados pelo Windows Installer. Os comandos típicos são estes dois, embora você veja os avisos abaixo: eles podem ser lentos e causar reparos no MSI.

# Win32_Product (WMI)
Get-WmiObject -Class Win32_Product | Select-Object -Property Name

# Alias rápido
gwmi Win32_Product

# WMIC clásico
wmic product get name,version

Por fim, muitas pessoas tentam usar o cmdlet Get-Package. Observação: o Get-Package lista apenas os pacotes instalados por meio do Gerenciamento de Pacotes (NuGet/PowerShellGet e similares) , e não todos os softwares de sistema tradicionais. Mesmo assim, ele é útil para módulos e scripts instalados a partir de repositórios.

# Paquetes gestionados por PackageManagement
Get-Package

# Todas las versiones de un proveedor concreto
Get-Package -ProviderName PowerShellGet -AllVersions

# Versión concreta de un paquete
Get-Package -Name PackageManagement -ProviderName PowerShellGet -RequiredVersion 1.3.1

Se você gerencia várias máquinas, pode usar o PowerShell Remoting para consultar pacotes gerenciados remotamente. Por exemplo, execute o comando Get-Package no Server01 com credenciais válidas:

Invoke-Command -ComputerName Server01 -Credential CONTOSO\TestUser -ScriptBlock { Get-Package }

Exporte a lista para TXT ou CSV e compare antes/depois

Visualizar a saída na tela é bom, mas salvá-la em um arquivo é mais prático. Com o PowerShell, você pode enviar a saída para um arquivo TXT, organizado por nome do programa, para revisão ou compartilhamento posterior.

# 32 bits en TXT
Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* |
  Select-Object DisplayName, DisplayVersion, Publisher, InstallDate |
  Sort-Object DisplayName |
  Out-File -FilePath "C:\Users\TuUsuario\Documents\InstalledPrograms.txt"

Se preferir um arquivo CSV legível no Excel/LibreOffice, você pode exportar ambas as versões (64 bits e 32 bits) para um único arquivo. O exemplo clássico usa o comando Out-File para exportar para a extensão .csv; no entanto, para um arquivo CSV nativo, é melhor usar o comando Export-Csv -NoTypeInformation.

# 64 bits a CSV
Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* |
  Select-Object DisplayName, DisplayVersion, Publisher, InstallDate |
  Sort-Object DisplayName |
  Export-Csv -NoTypeInformation -Encoding UTF8 -Path "C:\Ruta\De\Tu\Archivo\Programas.csv"

# 32 bits al mismo CSV (añadiendo)
Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* |
  Select-Object DisplayName, DisplayVersion, Publisher, InstallDate |
  Sort-Object DisplayName |
  Export-Csv -NoTypeInformation -Encoding UTF8 -Append -Path "C:\Ruta\De\Tu\Archivo\Programas.csv"

Quando o objetivo é reinstalar o sistema sem perder nada, uma técnica útil é gerar uma lista de "antes" e uma lista de "depois" e compará-las. Com o comando Compare-Object, você pode ver rapidamente o que está faltando ou o que é desnecessário ; você também pode combiná-lo com guias para automatizar a instalação de softwares e drivers após a formatação.

Compare-Object -ReferenceObject (Get-Content C:\Users\TuUsuario\Documents\InstalledPrograms.txt) \
               -DifferenceObject (Get-Content C:\Users\TuUsuario\Documents\InstalledPrograms2.txt)

Observe a coluna SideIndicator: o símbolo => indica que o item está no segundo arquivo e não no primeiro, enquanto <= significa o oposto. Se aparecer =, significa que o item está listado em ambos os arquivos sem nenhuma diferença.

  Tutorial básico de OSINT para começar com o pé direito.

Exportar lista de programas com PowerShell

Verifique o Registro: Chaves de desinstalação, contagem e propriedades

A maioria dos instaladores padrão registra informações de desinstalação no Registro do Windows. Portanto, se você precisar de uma lista semelhante à do "Adicionar ou Remover Programas", a fonte mais confiável é a chave de desinstalação do computador .

O caminho principal é: HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall, e para aplicativos de 32 bits em sistemas de 64 bits você também tem a ramificação: HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall.

Para contar quantas aplicações estão registradas em uma ramificação específica, você pode usar o cmdlet Get-ChildItem e obter o número de subchaves:

$UninstallPath = 'HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall'
(Get-ChildItem -Path $UninstallPath).Count

Se você deseja extrair propriedades específicas (por exemplo, apenas o nome de exibição), pode recuperar os valores do Registro com GetValue('DisplayName') e classificá-los para facilitar a leitura:

Get-ChildItem -Path $UninstallPath |
  ForEach-Object { $_.GetValue('DisplayName') } |
  Sort-Object

Para compor objetos com múltiplas propriedades (semelhante ao que você veria com o Win32Reg_AddRemovePrograms do SCCM), você pode criar um pequeno pipeline que adiciona um identificador, editor, versão e data de instalação; isso fornece um inventário mais completo :

Get-ChildItem $UninstallPath |
  ForEach-Object {
    $ProdID = ($_.Name -split '\\')
    Get-ItemProperty -Path "$UninstallPath\$ProdID" -ErrorAction SilentlyContinue |
      Select-Object DisplayName, InstallDate, @{n='ProdID'; e={$ProdID}}, Publisher, DisplayVersion
  } | Select-Object -First 10

Essa abordagem evita as desvantagens do Win32_Product (lento e com efeitos colaterais do MSI) e não depende do SCCM como a classe Win32Reg_AddRemovePrograms , tornando-a muito útil para auditorias locais sem infraestrutura adicional.

WMI/WMIC: Quando usar e quais são os riscos?

As classes WMI relacionadas ao Windows Installer (como Win32_Product) retornam apenas softwares instalados com MSI, excluindo instaladores que usam outros mecanismos. Além disso, consultar Win32_Product pode acionar reparos em produtos MSI e levar um tempo considerável, o que está longe do ideal em servidores de produção.

Mesmo assim, existem ambientes em que você vai querer extrair exatamente o que o Windows Installer "sabe". É para isso que servem os seguintes arquivos:

Get-WmiObject -Class Win32_Product | Select-Object -Property Name

gwmi Win32_Product

wmic product get name,version

Se você usar esses comandos, faça-o com plena consciência e durante janelas de manutenção. Para inventários gerais, o método do Registro costuma ser mais seguro e rápido , além de abranger uma gama maior de aplicações.

  Descubra como fazer o iPhone piscar quando um nome é recebido

Get-Package em detalhes: o que ele realmente lista e parâmetros úteis

O cmdlet Get-Package pertence ao PackageManagement (OneGet) e retorna os pacotes instalados por seus provedores (PowerShellGet, NuGet, etc.), relacionados aos instaladores de pacotes de software mais populares.

A sintaxe básica permite filtrar por nome e versão. Você pode forçar a inicialização do provedor, se necessário (Bootstrap), listar todas as versões e filtrar por provedor (PowerShellGet, NuGet) ou tipo (módulos, scripts):

Get-Package  <String[]>]    
               >]         

Parâmetros relevantes a conhecer (alguns são dinâmicos e dependem do provedor): aqui está uma visão geral essencial :

  • -Nome: um ou mais nomes (curingas suportados). Útil para encontrar pacotes específicos.
  • -Nome do Provedor: Filtrar por fornecedor; valores típicos: Bootstrap, NuGet, PowerShellGet. Melhor combinado com -AllVersions.
  • -Todas as Versões: Retorna todas as versões instaladas, não apenas a mais recente.
  • -Versão necessária, -MinimumVersion, -MaximumVersion: limita a versão exata ou o intervalo de versões a serem retornadas.
  • -Escopo: CurrentUser ou AllUsers, dependendo de onde o pacote está instalado.
  • -force: Evite confirmações e force o comando quando apropriado.
  • -ForçaBootstrap: Instala automaticamente o provedor necessário se ele não estiver presente.
  • -Permitir versões de pré-lançamento: inclui versões preliminares nos resultados.
  • -InstalarAtualizar: Para cenários em que o Get-Package pode instalar atualizações com provedores que o suportam.
  • -Type (PowerShellGet): Módulo, Script ou Todos.
  • -ExcludeVersion e -Destination (NuGet): afeta o nome da pasta e o diretório de extração quando aplicável.
  • -IgnorarDependências (NuGet): Ignora a pesquisa de dependência.
  • -IgnorarVerificaçãoDoPublicador (PowerShellGet): Ignore verificações do editor em certos casos.
  • -Provedor de Gerenciamento de Pacotes: Especifica o provedor de gerenciamento de pacotes.
  • -NoPathUpdate: Parâmetro dinâmico Install-Script; na verdade, não se aplica a Get-Package.
  • Parâmetros comuns: Verbose, Debug, ErrorAction, WarningAction, OutVariable, etc.

Exemplos práticos típicos incluem listar tudo o que está instalado com o PowerShellGet, pesquisar uma versão específica e até mesmo desinstalar encadeando o comando Uninstall-Package por meio do pipeline:

# Todo lo de PowerShellGet, con todas las versiones
Get-Package -ProviderName PowerShellGet -AllVersions

# Versión exacta de PackageManagement
Get-Package -Name PackageManagement -ProviderName PowerShellGet -RequiredVersion 1.3.1

# Desinstalar una versión concreta de un paquete
Get-Package -Name posh-git -RequiredVersion 0.7.3 | Uninstall-Package

Observe que o cmdlet Get-Package oferece suporte a acesso remoto (Invoke-Command ou Enter-PSSession) e que os provedores podem adicionar parâmetros dinâmicos. A saída é um objeto Microsoft.PackageManagement.Packaging.SoftwareIdentity , contendo metadados do pacote.

  Como usar o Winget para instalar e gerenciar programas no Windows

E quanto ao software “instalado manualmente”? Limitações a serem consideradas

Algumas aplicações são instaladas copiando pastas e não registram um desinstalador. Elas não aparecerão em Desinstalar, Win32_Product ou Gerenciamento de Pacotes. Nesses casos, gerencie-as como arquivos e pastas, usando técnicas manuais de instalação de programas com scripts que buscam caminhos, executáveis ​​ou assinaturas específicos.

Pelo mesmo motivo, dois computadores com o mesmo software podem apresentar resultados diferentes se um foi instalado usando MSI e o outro com um instalador diferente, sem registrar a desinstalação . O inventário ideal combina diversas técnicas, dependendo do ambiente.

Compatibilidade de execução remota e versões do Windows

Para servidores e frotas de PCs, o PowerShell Remoting é a melhor opção. Com uma sessão remota (Enter-PSSession) ou invocação de comando (Invoke-Command), você pode coletar dados usando os mesmos comandos que já conhece, centralizando o inventário da sua máquina.

Exemplo básico para consultar Get-Package em um servidor remoto com credenciais de domínio válidas, ideal se você já tiver o WinRM configurado:

Invoke-Command -ComputerName Server01 -Credential CONTOSO\TestUser -ScriptBlock { Get-Package }

As técnicas de registro (desinstalação) funcionam no Windows 7/10/11 e no Windows Server 2012 R2/2016/2019, enquanto o Get-Package requer que o PackageManagement e os provedores apropriados estejam presentes ou sejam instalados automaticamente (o ForceBootstrap ajuda).

listar programas instalados com powershell-3
Artigo relacionado:
Listar programas instalados no Windows com PowerShell e outras técnicas