Kuinka saada luettelo kaikista asennetuista ohjelmistoista PowerShellistä

Viimeisin päivitys: 16/10/2025
Kirjoittaja: Isaac
  • Rekisteri (Asennuksen poistoavaimet) on luotettavin lähde sille, mitä "Lisää tai poista sovellus" näyttää.
  • Win32_Product toimii MSI-laitteilla, mutta se on hidas ja voi aiheuttaa korjauksia; käytä varoen.
  • Get-Package listaa PackageManagement (PowerShellGet/NuGet) -paketit, ei kaikkia järjestelmäohjelmistoja.
  • Vie ja vertaa TXT/CSV-tiedostoilla ja Compare-Objectilla; Geek Uninstaller ja UninstallView tehostavat raportointia.

Listaa asennetut ohjelmistot PowerShellin avulla

Jos olet joskus halunnut nopeasti selvittää, mitä ohjelmia tietokoneellasi on WindowsHallinnoitpa palvelimia ilman graafista käyttöliittymää tai asennatko järjestelmääsi uudelleen, haluat luotettavan tietovaraston. Tässä artikkelissa selitän tämän yksityiskohtaisesti askel askeleelta. kaikki tavat listata ja viedä asennettuja ohjelmistoja käyttäen PowerShell, WMI, rekisteri ja kolmannen osapuolen työkalut.

Aiomme integroida useita todistettuja tekniikoita, kommentoida niiden hyviä ja huonoja puolia, ja näet siitä komennot suoraan lisäasetuksiin, kuten Get-Package, jossa on PackageManagement, rekisterikyselyt (Poista asennus), etäsuoritus ja jopa vertailut ilmoitusten välillä ennen ja jälkeen formatearLisäksi lisäämme TXT/CSV/HTML-vientivaihtoehtoja ja niille, jotka haluavat, kolmannen osapuolen apuohjelmia, jotka tekevät tämän vain kahdella napsautuksella.

Miksi ohjelmien listaaminen kannattaa

Selkeä luettelo estää uudelleenasennuksen yhteydessä tapahtuvia virheitä ja auttaa havaitsemaan ohjelmistot, joita et enää käytä. Monille tietokoneille kertyy testaamattomia sovelluksia, jotka unohtuvat, vievät tilaa ja, mikä pahinta, jotkut jäävät taustalla kuluttamaan resursseja huomaamattasi.

Luettelon avulla voit tarkastella sovelluksia yhdellä silmäyksellä sen sijaan, että sinun tarvitsisi selata ”Sovellukset ja ominaisuudet” -käyttöliittymää. Se myös helpottaa tukea, auditointia ja vaatimustenmukaisuutta ja säästää aikaasi, jos hallinnoit useita Windows Core -tietokoneita tai -palvelimia, joissa Käyttöliittymää ei ole, ja kaikki tapahtuu konsolin kautta..

Nämä tekniikat toimivat useissa Windows-versioissa, mukaan lukien Windows Server 2012 R2, 2016, 2019 ja Windows 7/10/11, vivahteikkain yksityiskohdin, joita kommentoimme tarvittaessa.

Huomaat myöhemmin, että kaikki metodit eivät näytä samaa asiaa: PowerShell, WMI, rekisteri ja PackageManagement kaikki kyselevät eri lähteistä. Siksi on tärkeää tietää, mitä kukin tekniikka kattaa ja mitkä ovat sen rajoitukset. valitsemaan oikean kussakin tapauksessa.

PowerShell-luettelo asennetuista ohjelmista

Nopeat PowerShell-menetelmät asennettujen ohjelmien tarkastelemiseen

PowerShell tarjoaa suoria polkuja listan tulostamiseen. Aloitetaan perusasioista: tarkista poistoavaimet rekisteristä, joka itse asiassa käyttää klassista "Lisää/poista sovellus" -näkymää.

Alias gp (Get-ItemProperty) Mahdollistaa ominaisuuksien nopean lukemisen. Voit yhdistää kaksi polkua (64-bittinen ja 32-bittinen) ja suodattaa näkyviin nimiin perustuvia elementtejä:

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

Jos haluat jotain jäsennellympää (nimi, versio, julkaisija, päivämäärä), erottele arkkitehtuurin ja muodon mukaan kompaktissa taulukossa näytöllä tarkastelua varten; toimii erittäin hyvin nopeaan lukemiseen:

# 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

Windows Installerin kautta asennettujen ohjelmistojen löytämiseen on myös WMI/WMIC-reitti. Tyypillisiä komentoja ovat nämä kaksi, vaikka niiden varoitukset näkyvät alla: Ne voivat olla hitaita ja aiheuttaa MSI-korjauksia.

# 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

Lopuksi, monet ihmiset kokeilevat Get-Package-palvelua. Huomautus: Get-Package listaa vain PackageManagementin (NuGet/PowerShellGet ja vastaavat) kautta asennetut paketit, ei kaikkia perinteisiä järjestelmäohjelmistoja. Se on kuitenkin hyödyllinen repositorioista asennetuille moduuleille ja skripteille.

# 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

Jos hallinnoit useita tietokoneita, voit käyttää PowerShell Remoting -toimintoa hallittujen pakettien etäkyselyyn. Esimerkiksi Suoritat Get-Package-funktion Server01:llä voimassa olevilla tunnistetiedoilla:

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

Vie lista TXT- tai CSV-tiedostoon ja vertaa ennen/jälkeen-kuvia

Näytöllä katselu onnistuu, mutta tiedostoon tallentaminen on käytännöllisempää. PowerShellin avulla voit lähettää tulosteen TXT lajiteltu ohjelman nimen mukaan tarkastella sitä rauhallisesti tai jakaa se.

# 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"

Jos haluat Excelissä/LibreOfficessa luettavan CSV-tiedoston, voit viedä molemmat haarat (64- ja 32-bittiset) yhteiseen tiedostoon. Klassinen esimerkki tuottaa Out-File-komennolla .csv-tiedostopäätteen; oikean CSV-tiedoston kohdalla on kuitenkin parempi käyttää 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"

Kun tavoitteena on asentaa järjestelmä uudelleen menettämättä mitään, hyödyllinen tekniikka on luoda "ennen" ja "jälkeen" -luettelo ja vertailla niitä. Vertailuobjektin avulla näet nopeasti, mitä puuttuu tai mitä on ylimääräistä; voit myös yhdistää sen oppaisiin automatisoida ohjelmistojen ja ajureiden asennuksen muotoilun jälkeen.

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

Katso SideIndicator-saraketta: =>-symboli osoittaa, että se on toisessa tiedostossa eikä ensimmäisessä, kun taas <= tarkoittaa päinvastaista. Jos = näkyy, elementti esiintyy molemmilla listoilla ilman eroja.

  iPhone katkaisee yhteyden WiFi-verkkoon, kun se on lukittu tai lepotilassa

Vie ohjelmaluettelo PowerShellin avulla

Tarkista rekisteri: Poista avaimet, lukumäärä ja ominaisuudet

Useimmat perinteiset asennusohjelmat tallentavat poistotiedot rekisteriin. Joten jos tarvitset "Lisää tai poista sovellus" -kohdan kaltaisen luettelon, Luotettavin lähde on Uninstall-avain. joukkueen.

Pääpolku on: HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall, ja 32-bittisille sovelluksille 64-bittisissä järjestelmissä on myös haara: HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Poista asennus.

Voit laskea, kuinka monta sovellusta tietyssä haarassa on rekisteröity, käyttämällä Get-ChildItem ja saat aliavaimien lukumäärän:

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

Jos haluat poimia tiettyjä ominaisuuksia (esimerkiksi vain näyttönimen), voit hakea rekisteriarvot komennolla GetValue('Näyttönimi') ja lajittele ne mukavamman lukemisen takaamiseksi:

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

Jos haluat koota objekteja, joilla on useita ominaisuuksia (samanlainen kuin mitä näkisit SCCM:n Win32Reg_AddRemoveProgramsissa), voit rakentaa pienen prosessin, joka lisää tunnisteen, julkaisijan, version ja asennuspäivämäärän; Näin saat kattavamman varastotilanteen:

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

Tämä lähestymistapa välttää Win32_Productin haitat (hitaus ja MSI-sivuvaikutukset) eikä ole riippuvainen SCCM:stä luokkana. Win32Reg_AddPoistaOhjelmat, mikä tekee siitä erittäin hyödyllisen paikallisissa auditoinneissa ilman lisäinfrastruktuuria.

WMI/WMIC: Milloin käyttää ja mitkä ovat riskit?

Windows Installeriin liittyvät WMI-luokat (kuten Win32_Product) palauttavat vain MSI:llä asennetun ohjelmiston, eivätkä ne palauta asennusohjelmia, jotka käyttävät muita asennusohjelmia. Lisäksi Win32_Product-kysely voi käynnistää MSI-tuotteiden korjaukset ja vievät kauan aikaa, mikä ei ole ihanteellista tuotantopalvelimilla.

Silti on olemassa ympäristöjä, jotka kiinnostavat sinua poimi tarkalleen sen, mitä "tiedät" Windows Installer. Sitä varten ne ovat:

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

gwmi Win32_Product

wmic product get name,version

Jos käytät näitä komentoja, tee se huolellisesti ja huoltokatkosten aikana. Yleisten inventaarioiden osalta Rekisterimenetelmä on yleensä turvallisempi ja nopeampi, ja se kattaa laajemman sovellusalueen.

  Safari Personal Looking -valinta puuttuu iPhonesta tai iPadista

Get-Package-paketin perusteellinen kuvaus: mitä se oikeastaan ​​listaa ja hyödylliset parametrit

Get-Package kuuluu PackageManagementiin (OneGet) ja palauttaa palveluntarjoajiensa (PowerShellGet, NuGet jne.) asentamat paketit, jotka liittyvät suosituimmat ohjelmistopakettien asennusohjelmat.

Perussyntaksi tukee suodattimia nimen ja versioiden perusteella. Voit pakottaa palveluntarjoajan alustamaan tarvittaessa (bootstrap), listaamaan kaikki versiot ja rajaa tarjoajan mukaan (PowerShellGet, NuGet) tai tyypin mukaan (moduulit, skriptit):

Get-Package  <String[]>]    
               >]         

Olennaiset parametrit, jotka on hyvä tietää (jotkut ovat dynaamisia ja riippuvat palveluntarjoajasta): Tässä on olennainen arvostelu:

  • -Nimi: yksi tai useampi nimi (jokerimerkkejä tuetaan). Hyödyllinen tiettyjen pakettien etsimiseen.
  • -PalveluntarjoajanNimi: Suodata toimittajan mukaan; tyypilliset arvot: Bootstrap, NuGet, PowerShellGet. Toimii parhaiten yhdessä -AllVersions-valitsimen kanssa.
  • -KaikkiversiotPalauttaa kaikki asennetut versiot, ei vain uusinta.
  • -VaadittuVersio, -MinimumVersion, -MaximumVersion: rajaa palautettavan version tai versiovälin tarkan määrän.
  • -SoveltamisalaNykyinen käyttäjä tai Kaikki käyttäjät riippuen siitä, mihin paketti on asennettu.
  • -PakottaaVältä vahvistuksia ja pakota komento tarvittaessa.
  • -ForceBootstrap: Asentaa automaattisesti vaaditun palveluntarjoajan, jos sitä ei ole.
  • -AllowPrereleaseVersions: sisältää alustavat versiot tuloksissa.
  • -AsennaPäivitä: Tilanteissa, joissa Get-Package voi asentaa päivityksiä sitä tukevien palveluntarjoajien avulla.
  • -Tyyppi (PowerShellGet): Moduuli, Käsikirjoitus tai Kaikki.
  • -Sulje poisVersio ja -Kohde (NuGet): vaikuttavat kansion nimeen ja purkuhakemistoon soveltuvin osin.
  • -Ohita riippuvuudet (NuGet): Ohita riippuvuushaku.
  • -SkipPublisherCheck (PowerShellGet): Ohita julkaisijan tarkistukset tietyissä tapauksissa.
  • -Pakettienhallinnantarjoaja: Määrittää paketinhallinnan tarjoajan.
  • -EiPathUpdatea: Install-Scriptin dynaaminen parametri; ei itse asiassa koske Get-Packagea.
  • Yhteiset parametritVerbose, Debug, ErrorAction, WarningAction, OutVariable jne.

Tyypillisiä käytännön esimerkkejä ovat kaiken asennetun listaaminen PowerShellGetillä, tietyn version etsiminen ja jopa asennuksen poistaminen ketjuttamalla Uninstall-Paketti kanavoinnin kautta:

# 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

Huomaa, että Get-Package on etäyhteensopiva (Invoke-Command tai Enter-PSSession) ja että tarjoajat voivat lisätä dynaamisia parametreja. Tuloste on tyyppiä oleva objekti Microsoft.PackageManagement.Packaging.SoftwareIdentity, paketin metatiedoilla.

  Mitä ovat WDAC-manipulaatiohyökkäykset ja miten niillä voi puolustautua?

Entä "manuaalisesti asennettu" ohjelmisto? Pidä mielessä rajoitukset

On olemassa sovelluksia, jotka asentuvat kopioimalla kansioita eivätkä rekisteröi asennuksenpoisto-ohjelmaa. Nämä eivät näy Uninstall- tai Win32_Product-kansioissa eivätkä PackageManagementissa. Näissä tapauksissa hallitse niitä tiedostoina ja kansioina noudattamalla seuraavia tekniikoita: asenna ohjelmia manuaalisesti, skripteillä, jotka etsivät tiettyjä polkuja, suoritettavia tiedostoja tai allekirjoituksia.

Samasta syystä kaksi tietokonetta, joilla on sama ohjelmisto, voivat näyttää erilaisia ​​tuloksia, jos toiseen ja toiseen on asennettu MSI. eri asennusohjelmalla ilman poiston tallentamistaIhanteellinen inventaario yhdistää useita tekniikoita ympäristöstä riippuen.

Etäsuoritus ja Windows-versioiden yhteensopivuus

Palvelimille ja tietokonekalustoille PowerShell Remoting on oikea valinta. Etäkäyttöliittymän (Enter-PSSession) tai komennon kutsumisen (Invoke-Command) avulla voit kerätä tietoja samoilla komennoilla, joita käytit aiemmin. keskittää varaston tietokoneeltasi.

Perusesimerkki Get-Package-kyselyn tekemiseksi etäpalvelimella, jolla on voimassa olevat verkkotunnustiedot. Ihanteellinen, jos WinRM on jo määritetty:

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

Rekisterin poistotekniikat toimivat Windows 7/10/11- ja Windows Server 2012 R2/2016/2019 -käyttöjärjestelmissä, kun taas Get-Package vaatii Pakettien hallinta ja toimittajat sopiva läsnä tai itse asennettavissa (ForceBootstrap auttaa).

Listaa asennetut ohjelmat PowerShell-3:lla
Aiheeseen liittyvä artikkeli:
Listaa asennetut ohjelmat Windowsissa PowerShellin ja muiden tekniikoiden avulla