Arbeta med programinstallationer
Program som är utformade för att använda Windows Installer kan nås via WMI:s Win32_Product-klass, men alla program som används i dag använder inte 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å installationsprogrammets programvara och de 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 metoder som beskrivs i Arbeta med filer och mappar.
Varning
Klassen Win32_Product 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 sedan parsa den fullständiga listan sekventiellt för att hantera filtret. Detta initierar också en konsekvenskontroll av installerade paket, verifierar och reparerar installationen. Verifieringen är långsam och kan resultera i fel i händelseloggarna. Mer information finns i KB-artikeln 974524.
Lista Windows installationsprogram
Om du vill visa en lista över de program Windows installationsprogrammet på ett lokalt eller fjärranslutet system 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 Win32_Product objektet på skärmen använder du parametern Egenskaper för formaterings-cmdletarna, till exempel Format-List cmdleten, 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
Eller så kan du använda Get-CimInstance parametern Filter för att välja Microsoft .NET 2.0 Runtime. Värdet för parametern Filter använder WMI Query Language (WQL)-syntax, 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 är dock möjligt 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 "Avinstallera:" 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 Avinstallera: 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 $UninstallableApplications variabeln 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 Värdena för DisplayName är unika.
Installera program
Du kan använda klassen Win32_Product för att installera Windows Installer-paket, via fjärrinstallation 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 Universal Naming Convention(UNC)-nätverkssökväg 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 NewPackage.msi paketet som finns i nätverksresursen på fjärrdatorn PC01 skriver du följande kommando i \\AppServ\dsp 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. Läs dokumentationen för programmet eller kontakta programleverantörens supportsystem.
Ta bort program
Att ta Windows installationspaket 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 IdentifyingNumber:
Get-CimInstance -Class Win32_Product -Filter "Name='ILMerge'" | Invoke-CimMethod -MethodName Uninstall
Det är inte helt enkelt att ta bort andra program, även om det görs lokalt. Vi hittar kommandoradsavinstallationssträngarna för dessa program genom att extrahera egenskapen UninstallString. Den här metoden fungerar Windows installationsprogram och för äldre program som visas under avinstallationsnyckeln:
Get-ChildItem -Path Uninstall: | ForEach-Object -Process { $_.GetValue('UninstallString') }
Du kan filtrera utdata efter visningsnamn om du vill:
Get-ChildItem -Path Uninstall: |
Where-Object -FilterScript { $_.GetValue('DisplayName') -like 'Win*'} |
ForEach-Object -Process { $_.GetValue('UninstallString') }
Dessa strängar kan dock inte användas direkt från PowerShell-prompten utan några ändringar.
Uppgradera Windows Installationsprogram
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'}