Arbeta med programinstallationer

Program som installerats med Windows Installer kan hittas via WMI:s frågor, men inte alla program använder Windows Installer. De specifika teknikerna för att hitta program som installerats med andra verktyg beror på installationsprogrammet.

Till exempel kan program som installeras genom att kopiera filerna till en mapp på datorn vanligtvis inte hanteras med hjälp av tekniker som beskrivs här. Du kan hantera dessa program som filer och mappar med hjälp av de tekniker som beskrivs i Arbeta med filer och mappar.

För programvara som installeras med ett installationspaket kan Windows Installer hittas med hjälp av Win32Reg_AddRemovePrograms- eller Win32_Product-klasserna. Båda dessa har dock problem. Den Win32Reg_AddRemovePrograms är endast tillgänglig om du använder System Center Configuration Manager (SCCM). Och den Win32_Product klassen kan vara långsam och har biverkningar.

Varning

Klassen Win32_Product är inte frågeoptimerad. Frågor som använder jokerteckenfilter gör att WMI använder MSI-providern för att räkna upp alla installerade produkter och parsar sedan hela listan sekventiellt för att hantera filtret. Detta initierar också en konsekvenskontroll av installerade paket, verifierar och reparerar installationen. Valideringen är en långsam process och kan resultera i fel i händelseloggarna. Mer information finns i KB-artikeln 974524.

Den här artikeln innehåller en alternativ metod för att hitta installerad programvara.

Köra frågor mot registernyckeln Avinstallera för att hitta installerad programvara

Eftersom de flesta standardprogram registrerar en avinstallation med Windows kan vi arbeta med dem lokalt genom att hitta dem i Windows-registret. Det finns inget garanterat sätt att hitta alla program i ett system. Det går dock att hitta alla program med listor som visas i Lägg till eller ta bort program i följande registernyckel:

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

Vi hittar antalet installerade program genom att räkna antalet registernycklar:

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

Vi kan söka i den här listan över program ytterligare med hjälp av en mängd olika tekniker. Om du vill visa värdena för registervärdena i registernycklarna under Uninstallanvänder du GetValue() metoden för registernycklarna. Värdet för metoden är namnet på registerposten. Om du till exempel vill hitta visningsnamnen Uninstall för program i nyckeln använder du följande kommando:

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

Kommentar

Det finns ingen garanti för att DisplayName-värdena är unika.

I följande exempel genereras utdata som liknar klassen Win32Reg_AddRemovePrograms :

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

För korthets skull använder Select-Object det här exemplet för att begränsa antalet objekt som returneras till tre.

DisplayName    : 7-Zip 22.01 (x64)
InstallDate    :
ProdID         : 7-Zip
Publisher      : Igor Pavlov
DisplayVersion : 22.01

DisplayName    : AutoHotkey 1.1.33.10
InstallDate    :
ProdID         : AutoHotkey
Publisher      : Lexikos
DisplayVersion : 1.1.33.10

DisplayName    : Beyond Compare 4.4.6
InstallDate    : 20230310
ProdID         : BeyondCompare4_is1
Publisher      : Scooter Software
DisplayVersion : 4.4.6.27483