Met software-installaties werken

Toepassingen die zijn ontworpen voor het gebruik van Windows Installer zijn toegankelijk via de Win32_Product-klasse van WMI, maar niet alle toepassingen die momenteel worden gebruikt, maken gebruik van Windows Installer. Toepassingen die gebruikmaken van alternatieve installatieroutines worden doorgaans niet beheerd door het Windows Installatieprogramma. Specifieke technieken voor het werken met deze toepassingen zijn afhankelijk van de installatiesoftware en de beslissingen van de toepassingsontwikkelaar. Toepassingen die zijn geïnstalleerd door de bestanden naar een map op de computer te kopiëren, kunnen bijvoorbeeld meestal niet worden beheerd met behulp van technieken die hier worden besproken. U kunt deze toepassingen beheren als bestanden en mappen met behulp van de technieken die worden besproken in Werken met bestanden en mappen.

Waarschuwing

De Win32_Product klasse is niet geoptimaliseerd voor query's. Query's die gebruikmaken van jokertekenfilters zorgen ervoor dat WMI de MSI-provider gebruikt om alle geïnstalleerde producten op te semuleren en vervolgens de volledige lijst opeenvolgend te parseren om het filter te verwerken. Hiermee initieert u ook een consistentiecontrole van geïnstalleerde pakketten, die de installatie controleren en herstellen. De validatie is een traag proces en kan leiden tot fouten in de gebeurtenislogboeken. Ga voor meer informatie naar KB-artikel 974524.

Lijst met Windows Installer-toepassingen

Gebruik de volgende eenvoudige WMI-query om Windows toepassingen weer te geven die zijn geïnstalleerd met het installatieprogramma op een lokaal of extern systeem:

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…

Als u alle eigenschappen van het Win32_Product-object wilt weergeven voor de weergave, gebruikt u de parameter Eigenschappen van de opmaak-cmdlets, zoals de cmdlet , met de waarde Format-List * (alle).

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

U kunt ook de Get-CimInstance filterparameter gebruiken om alleen een Microsoft .NET 2.0 Runtime te selecteren. De waarde van de filterparameter maakt gebruik van WMI Query Language syntaxis (WQL), niet Windows PowerShell syntaxis. Bijvoorbeeld:

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

Als u alleen de eigenschappen wilt weergeven die u interesseren, gebruikt u de eigenschapsparameter van de opmaak-cmdlets om de gewenste eigenschappen weer te geven.

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}

Alle verwijderbare toepassingen in een lijst bekijken

Omdat de meeste standaardtoepassingen een installatie van een Windows registreren, kunnen we lokaal met deze toepassingen werken door ze te zoeken in het Windows register. Er is geen gegarandeerde manier om elke toepassing op een systeem te vinden. Het is echter mogelijk om te zoeken naar alle programma's met vermeldingen weergegeven in programma's toevoegen of verwijderen in de volgende registersleutel:

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

We kunnen deze sleutel onderzoeken om toepassingen te vinden. Om het gemakkelijker te maken om de sleutel verwijderen weer te geven, kunnen we een PowerShell-station aan deze registerlocatie geven:

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

We hebben nu een station met de naam 'Verwijderen:' dat kan worden gebruikt om snel en gemakkelijk te zoeken naar toepassingsinstallaties. We kunnen het aantal geïnstalleerde toepassingen vinden door het aantal registersleutels te tellen in het powershell-station Verwijderen:

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

We kunnen deze lijst met toepassingen verder doorzoeken met behulp van verschillende technieken, te beginnen met Get-ChildItem . Gebruik de volgende opdracht om een lijst met toepassingen op te halen en op te slaan in $UninstallableApplications de variabele :

$UninstallableApplications = Get-ChildItem -Path Uninstall:

Als u de waarden van de registergegevens in de registersleutels onder Verwijderen wilt weergeven, gebruikt u de methode GetValue van de registersleutels. De waarde van de methode is de naam van de registerinvoer.

Als u bijvoorbeeld de weergavenamen van toepassingen wilt vinden in de sleutel Verwijderen, gebruikt u de volgende opdracht:

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

Notitie

Er is geen garantie dat de DisplayName-waarden uniek zijn.

Toepassingen installeren

U kunt de klasse Win32_Product gebruiken om op afstand Windows Installer-pakketten te installeren.

Notitie

Als u een toepassing wilt installeren, moet u PowerShell starten met de optie Als administrator uitvoeren.

Wanneer u op afstand installeert, gebruikt u een UNC-netwerkpad (Universal Naming Convention) om het pad naar het .msi-pakket op te geven, omdat het WMI-subsysteem geen inzicht heeft in PowerShell-paden. Als u bijvoorbeeld het NewPackage.msi in de netwerk share op de externe computer PC01 wilt installeren, typt u de volgende opdracht bij \\AppServ\dsp de PowerShell-prompt:

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

Toepassingen die niet gebruikmaken van Windows Installer-technologie hebben mogelijk toepassingsspecifieke methoden voor geautomatiseerde implementatie. Raadpleeg de documentatie voor de toepassing of raadpleeg het ondersteuningssysteem van de leverancier van de toepassing.

Toepassingen verwijderen

Het verwijderen Windows installatieprogrammapakket met Behulp van PowerShell werkt ongeveer op dezelfde manier als het installeren van een pakket. Hier is een voorbeeld dat het pakket selecteert dat moet worden verwijderd op basis van de naam; In sommige gevallen is het gemakkelijker om te filteren met identifyingnumber:

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

Het verwijderen van andere toepassingen is niet zo eenvoudig, zelfs niet wanneer u dit lokaal doet. We kunnen de opdrachtregel voor het verwijderen van tekenreeksen voor deze toepassingen vinden door de eigenschap UninstallString te extraheren. Deze methode werkt voor Windows Installer-toepassingen en oudere programma's die worden weergegeven onder de sleutel Verwijderen:

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

U kunt de uitvoer filteren op de weergavenaam, als u wilt:

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

Deze tekenreeksen kunnen echter niet rechtstreeks vanuit de PowerShell-prompt worden gebruikt zonder enige aanpassing.

Upgraden Windows Installer-toepassingen

Als u een toepassing wilt upgraden, moet u de naam van de toepassing en het pad naar het toepassingsupgradepakket weten. Met deze informatie kunt u een toepassing upgraden met één PowerShell-opdracht:

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