Arbeta med programinstallationer

Program som är utformade för att använda Windows Installer kan nås via WMI :s Win32_Product-klass , men inte alla program som används idag använder Windows Installer. Program som använder alternativa konfigurationsrutiner hanteras vanligtvis inte av Windows Installer. Specifika tekniker för att arbeta med dessa program beror på installationsprogrammet och beslut som fattas av programutvecklaren. 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.

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.

Lista Windows Installer-program

Om du vill visa en lista över de program som installerats med Windows Installer på ett lokalt system eller ett fjärrsystem använder du följande enkla WMI-fråga:

Get-CimInstance -Class Win32_Product |
  Where-Object Name -eq "Microsoft .NET Core Runtime - 2.1.5 (x64)"
Name             Caption                   Vendor                    Version       IdentifyingNumber
----             -------                   ------                    -------       -----------------
Microsoft .NET … Microsoft .NET Core Runt… Microsoft Corporation     16.84.26919   {BEB59D04-C6DD-4926-AFE…

Om du vill visa alla egenskaper för Win32_Product-objektet till displayen använder du parametern Egenskaper för formaterings-cmdletar, till exempel cmdleten Format-List , med värdet * (alla).

Get-CimInstance -Class Win32_Product |
  Where-Object Name -eq "Microsoft .NET Core Runtime - 2.1.5 (x64)" |
    Format-List -Property *
Name                  : Microsoft .NET Core Runtime - 2.1.5 (x64)
Version               : 16.84.26919
InstallState          : 5
Caption               : Microsoft .NET Core Runtime - 2.1.5 (x64)
Description           : Microsoft .NET Core Runtime - 2.1.5 (x64)
IdentifyingNumber     : {BEB59D04-C6DD-4926-AFEB-410CBE2EBCE4}
SKUNumber             :
Vendor                : Microsoft Corporation
AssignmentType        : 1
HelpLink              :
HelpTelephone         :
InstallDate           : 20181105
InstallDate2          :
InstallLocation       :
InstallSource         : C:\ProgramData\Package Cache\{BEB59D04-C6DD-4926-AFEB-410CBE2EBCE4}v16.84.26919\
Language              : 1033
LocalPackage          : C:\WINDOWS\Installer\4f97a771.msi
PackageCache          : C:\WINDOWS\Installer\4f97a771.msi
PackageCode           : {9A271A10-039D-49EA-8D24-043D91B9F915}
PackageName           : dotnet-runtime-2.1.5-win-x64.msi
ProductID             :
RegCompany            :
RegOwner              :
Transforms            :
URLInfoAbout          :
URLUpdateInfo         :
WordCount             : 0
PSComputerName        :
CimClass              : root/cimv2:Win32_Product
CimInstanceProperties : {Caption, Description, IdentifyingNumber, Name...}
CimSystemProperties   : Microsoft.Management.Infrastructure.CimSystemProperties

Du kan också använda filterparametern Get-CimInstance för att endast välja Microsoft .NET 2.0 Runtime. Värdet för filterparametern använder WMI-frågespråksyntax (WQL), inte Windows PowerShell syntax. Exempel:

Get-CimInstance -Class Win32_Product -Filter "Name='Microsoft .NET Core Runtime - 2.1.5 (x64)'" |
  Format-List -Property *

Om du bara vill visa de egenskaper som intresserar dig använder du parametern Egenskap för formaterings-cmdletarna för att visa önskade egenskaper.

Get-CimInstance -Class Win32_Product  -Filter "Name='Microsoft .NET Core Runtime - 2.1.5 (x64)'" |
  Format-List -Property Name,InstallDate,InstallLocation,PackageCache,Vendor,Version,IdentifyingNumber
Name              : Microsoft .NET Core Runtime - 2.1.5 (x64)
InstallDate       : 20180816
InstallLocation   :
PackageCache      : C:\WINDOWS\Installer\4f97a771.msi
Vendor            : Microsoft Corporation
Version           : 16.72.26629
IdentifyingNumber : {ACC73072-9AD5-416C-94BF-D82DDCEA0F1B}

Visa en lista över alla avinstallationsbara program

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 kan undersöka den här nyckeln för att hitta program. För att göra det enklare att visa avinstallationsnyckeln kan vi mappa en PowerShell-enhet till den här registerplatsen:

New-PSDrive -Name Uninstall -PSProvider Registry -Root HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
Name       Provider      Root                                   CurrentLocation
----       --------      ----                                   ---------------
Uninstall  Registry      HKEY_LOCAL_MACHINE\SOFTWARE\Micr...

Nu har vi en enhet med namnet "Uninstall:" som kan användas för att snabbt och enkelt söka efter programinstallationer. Vi kan hitta antalet installerade program genom att räkna antalet registernycklar på enheten Uninstall: PowerShell:

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

Vi kan söka i den här listan med program ytterligare med hjälp av en mängd olika tekniker, från och med Get-ChildItem. Om du vill hämta en lista över program och spara dem i variabeln $UninstallableApplications använder du följande kommando:

$UninstallableApplications = Get-ChildItem -Path Uninstall:

Om du vill visa värdena för registerposterna i registernycklarna under Avinstallera använder du metoden GetValue för registernycklarna. Värdet för metoden är namnet på registerposten.

Om du till exempel vill hitta visningsnamnen för program i avinstallationsnyckeln använder du följande kommando:

$UninstallableApplications | ForEach-Object -Process { $_.GetValue('DisplayName') }

Anteckning

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

Installera program

Du kan använda klassen Win32_Product för att installera Windows Installer-paket, via fjärranslutning eller lokalt.

Anteckning

Om du vill installera ett program måste du starta PowerShell med alternativet "Kör som administratör".

När du fjärrinstallerar använder du en UNC-nätverkssökväg (Universal Naming Convention) för att ange sökvägen till .msi-paketet, eftersom WMI-undersystemet inte förstår PowerShell-sökvägar. Om du till exempel vill installera NewPackage.msi-paketet som finns i nätverksresursen \\AppServ\dsp på fjärrdatorn PC01 skriver du följande kommando i PowerShell-prompten:

Invoke-CimMethod -ClassName Win32_Product -MethodName Install -Arguments @{PackageLocation='\\AppSrv\dsp\NewPackage.msi'}

Program som inte använder Windows Installer-teknik kan ha programspecifika metoder för automatisk distribution. Kontrollera dokumentationen för programmet eller kontakta programleverantörens supportsystem.

Ta bort program

Att ta bort ett Windows Installer-paket med PowerShell fungerar ungefär på samma sätt som när du installerar ett paket. Här är ett exempel som väljer det paket som ska avinstalleras baserat på dess namn. I vissa fall kan det vara enklare att filtrera med IdentifieNumber:

Get-CimInstance -Class Win32_Product -Filter "Name='ILMerge'" | Invoke-CimMethod -MethodName Uninstall

Att ta bort andra program är inte så enkelt, även när det görs lokalt. Vi hittar kommandoradens avinstallationssträngar för dessa program genom att extrahera egenskapen UninstallString . Den här metoden fungerar för Windows Installer-program och för äldre program som visas under avinstallationsnyckeln:

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

Du kan filtrera utdata efter visningsnamnet om du vill:

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

Dessa strängar kanske dock inte kan användas direkt från PowerShell-prompten utan någon ändring.

Uppgradera Windows Installer-program

Om du vill uppgradera ett program måste du känna till namnet på programmet och sökvägen till programuppgraderingspaketet. Med den informationen kan du uppgradera ett program med ett enda PowerShell-kommando:

Get-CimInstance -Class Win32_Product -Filter "Name='OldAppName'" |
  Invoke-CimMethod -MethodName Upgrade -Arguments @{PackageLocation='\\AppSrv\dsp\OldAppUpgrade.msi'}