Práce s nainstalovaným softwarem

K aplikacím, které jsou navržené tak, aby používaly Instalační službu systému Windows, je možné získat přístup prostřednictvím třídy Win32_Product služby WMI, ale ne ke všem aplikacím, které se dnes používají, používají Instalační službu systému Windows. Aplikace, které používají alternativní rutiny instalace, obvykle nespravuje instalační služba systému Windows. Konkrétní techniky pro práci s těmito aplikacemi závisí na instalačním softwaru a rozhodnutích provedených vývojářem aplikací. Například aplikace nainstalované zkopírováním souborů do složky v počítači obvykle nejde spravovat pomocí technik, které jsou zde popsány. Tyto aplikace můžete spravovat jako soubory a složky pomocí technik probíraných v části Práce se soubory a složkami.

Upozornění

Třída Win32_Product není optimalizovaná. Dotazy, které používají zástupné filtry, způsobují, že služba WMI použije zprostředkovatele MSI k vytvoření výčtu všech nainstalovaných produktů a následné parsování úplného seznamu za účelem zpracování filtru. Tím se také zahájí kontrola konzistence nainstalovaných balíčků, ověření a oprava instalace. Ověření je pomalý proces a může způsobit chyby v protokolech událostí. Další informace najdete v článku znalostní báze 974524.

Výpis aplikací instalační služby systému Windows

Pokud chcete zobrazit seznam aplikací nainstalovaných s instalační službou systému Windows v místním nebo vzdáleném systému, použijte následující jednoduchý dotaz rozhraní WMI:

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…

Chcete-li zobrazit všechny vlastnosti objektu Win32_Product zobrazení, použijte parametr Vlastnosti rutin formátování, jako Format-List je například rutina, s hodnotou * (vše).

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

Nebo můžete pomocí parametru Get-CimInstanceFilter vybrat pouze modul Runtime microsoft .NET 2.0. Hodnota parametru Filter používá syntaxi jazyka WQL (WQL), nikoli syntaxi Windows PowerShell. Příklad:

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

Chcete-li zobrazit seznam pouze vlastností, které vás zajímají, použijte parametr Vlastnost rutin formátování k výpisu požadovaných vlastností.

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}

Výpis všech odinstalovatelných aplikací

Vzhledem k tomu, že většina standardních aplikací zaregistruje odinstalátor ve Windows, můžeme s nimi pracovat místně tak, že je najdete v registru Windows. Neexistuje žádný zaručený způsob, jak najít každou aplikaci v systému. Je však možné najít všechny programy se výpisy zobrazenými v části Přidat nebo odebrat programy v následujícím klíči registru:

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

Tento klíč můžeme prozkoumat a najít aplikace. Abychom usnadnili zobrazení klíče odinstalace, můžeme namapovat jednotku PowerShellu na toto umístění registru:

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

Teď máme jednotku s názvem "Uninstall:", kterou můžete použít k rychlému a pohodlnému vyhledávání instalací aplikací. Počet nainstalovaných aplikací zjistíme tak, že v jednotce Odinstalace spočítáme počet klíčů registru: Jednotka PowerShellu:

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

Tento seznam aplikací můžeme dále prohledávat pomocí různých technik, počínaje Get-ChildItem. Pokud chcete získat seznam aplikací a uložit je do $UninstallableApplications proměnné, použijte následující příkaz:

$UninstallableApplications = Get-ChildItem -Path Uninstall:

Chcete-li zobrazit hodnoty položek registru v klíčích registru v části Uninstall, použijte metodu GetValue klíčů registru. Hodnota metody je název položky registru.

Pokud chcete například najít zobrazované názvy aplikací v klíči Odinstalovat, použijte následující příkaz:

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

Poznámka

Hodnoty DisplayName nejsou jedinečné.

Instalace aplikací

Třídu Win32_Product můžete použít k instalaci balíčků Instalační služby systému Windows, vzdáleně nebo místně.

Poznámka

Pokud chcete nainstalovat aplikaci, musíte spustit PowerShell s možností Spustit jako správce.

Při vzdálené instalaci použijte síťovou cestu UNC (Universal Naming Convention) k určení cesty k balíčku .msi, protože subsystém WMI nerozumí cestám PowerShellu. Pokud chcete například nainstalovat balíček NewPackage.msi umístěný ve sdílené síťové složce \\AppServ\dsp na počítači PC01 vzdáleného počítače, zadejte na příkazovém řádku PowerShellu následující příkaz:

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

Aplikace, které nepoužívají technologii Instalační služby systému Windows, můžou mít metody specifické pro aplikace pro automatizované nasazení. Projděte si dokumentaci k aplikaci nebo se obraťte na systém podpory dodavatele aplikace.

Odebírání aplikací

Odebrání balíčku Instalační služby systému Windows pomocí PowerShellu funguje přibližně stejně jako instalace balíčku. Tady je příklad, který vybere balíček, který se má odinstalovat na základě jeho názvu; v některých případech může být jednodušší filtrovat pomocí funkce IdentifyingNumber:

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

Odebrání jiných aplikací není tak jednoduché, i když se provádí místně. Řetězce odinstalace příkazového řádku pro tyto aplikace můžeme najít extrahováním vlastnosti UninstallString . Tato metoda funguje pro aplikace Instalační služby systému Windows a pro starší programy, které se zobrazují pod klíčem Odinstalace:

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

Výstup můžete filtrovat podle zobrazovaného názvu, pokud chcete:

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

Tyto řetězce však nemusí být přímo použitelné z příkazového řádku PowerShellu bez nějaké úpravy.

Upgrade aplikací instalační služby systému Windows

Pokud chcete upgradovat aplikaci, potřebujete znát název aplikace a cestu k balíčku upgradu aplikace. Pomocí této informace můžete aplikaci upgradovat pomocí jednoho příkazu PowerShellu:

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