Praca z instalacjami oprogramowania

Aplikacje przeznaczone do używania instalatora Windows są dostępne za pośrednictwem klasy Win32_Product WMI, ale nie wszystkie obecnie używane aplikacje używają instalatora Windows. Aplikacje korzystające z alternatywnych procedur konfiguracji nie są zwykle zarządzane przez Windows Instalatora. Konkretne techniki pracy z tymi aplikacjami zależą od oprogramowania instalatora i decyzji podejmowanych przez dewelopera aplikacji. Na przykład aplikacjami zainstalowanymi przez skopiowanie plików do folderu na komputerze zazwyczaj nie można zarządzać przy użyciu technik omówionych w tym miejscu. Tymi aplikacjami można zarządzać jako plikami i folderami, korzystając z technik omówionych w artykule Praca z plikami i folderami.

Przestroga

Klasa Win32_Product nie jest zoptymalizowana pod kątem zapytań. Zapytania, które używają filtrów wieloznacznych, powodują, że usługa WMI używa dostawcy tożsamości usługi msi do wyliczania wszystkich zainstalowanych produktów, a następnie analizuje pełną listę sekwencyjnie w celu obsługi filtru. Inicjuje to również sprawdzanie spójności zainstalowanych pakietów, weryfikując i naprawiając instalację. Walidacja jest powolnym procesem i może powodować błędy w dziennikach zdarzeń. Aby uzyskać więcej informacji, odszukaj artykuł bazy wiedzy 974524.

Wyświetlanie listy Windows instalatora

Aby wyświetlić listę aplikacji zainstalowanych z instalatorem Windows lokalnym lub zdalnym, użyj następującego prostego zapytania usługi 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…

Aby wyświetlić wszystkie właściwości obiektu Win32_Product na ekranie, użyj parametru Właściwości w poleceniach cmdlet formatowania, takich jak polecenie cmdlet, z wartością Format-List * (wszystkie).

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

Możesz też użyć parametru Get-CimInstance Filtr, aby wybrać tylko Microsoft .NET 2.0 Runtime. Wartość parametru Filter używa składni język zapytań usługi WMI (WQL), a nie Windows PowerShell składni. Na przykład:

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

Aby wyświetlić listę tylko tych właściwości, które Cię interesują, użyj parametru Właściwość w poleceniach cmdlet formatowania, aby wyświetlić listę żądanych właściwości.

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}

Wyświetlanie listy wszystkich aplikacji, które można odinstalować

Ponieważ większość standardowych aplikacji rejestruje dezinstalator w Windows, możemy pracować z nimi lokalnie, znajdując je w Windows rejestru. Nie ma żadnej gwarantowanej możliwości znalezienia każdej aplikacji w systemie. Można jednak znaleźć wszystkie programy z listami wyświetlanymi w Dodaj lub Usuń programy w następującym kluczu rejestru:

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

Możemy przeanalizować ten klucz, aby znaleźć aplikacje. Aby ułatwić wyświetlanie klucza odinstalowania, możemy zamapować dysk programu PowerShell na tę lokalizację rejestru:

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

Mamy teraz dysk o nazwie "Odinstaluj:", który może służyć do szybkiego i wygodnego wyszukiwania instalacji aplikacji. Liczbę zainstalowanych aplikacji można znaleźć, licząc liczbę kluczy rejestru na dysku Odinstaluj: program PowerShell:

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

Tę listę aplikacji można przeszukiwać dalej przy użyciu różnych technik, począwszy Get-ChildItem od . Aby uzyskać listę aplikacji i zapisać je w $UninstallableApplications zmiennej , użyj następującego polecenia:

$UninstallableApplications = Get-ChildItem -Path Uninstall:

Aby wyświetlić wartości wpisów rejestru w kluczach rejestru w obszarze Odinstaluj, użyj metody GetValue kluczy rejestru. Wartość metody jest nazwą wpisu rejestru.

Aby na przykład znaleźć nazwy wyświetlane aplikacji w kluczu Odinstaluj, użyj następującego polecenia:

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

Uwaga

Nie ma gwarancji, że wartości DisplayName są unikatowe.

Instalowanie aplikacji

Za pomocą klasy Win32_Product można instalować pakiety instalatora Windows zdalnie lub lokalnie.

Uwaga

Aby zainstalować aplikację, należy uruchomić program PowerShell z opcją "Uruchom jako administrator".

Podczas instalacji zdalnej użyj ścieżki sieciowej Universal Naming Convention (UNC), aby określić ścieżkę do pakietu .msi, ponieważ podsystem WMI nie rozumie ścieżek programu PowerShell. Aby na przykład zainstalować pakiet NewPackage.msi znajdujący się w udziałach sieciowych na komputerze zdalnym PC01, wpisz następujące polecenie w \\AppServ\dsp wierszu polecenia programu PowerShell:

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

Aplikacje, które nie korzystają Windows technologii Instalatora, mogą mieć metody wdrażania automatycznego specyficzne dla aplikacji. Zapoznaj się z dokumentacją aplikacji lub skonsultuj się z systemem pomocy technicznej dostawcy aplikacji.

Usuwanie aplikacji

Usuwanie pakietu Windows przy użyciu programu PowerShell działa mniej więcej tak samo jak instalowanie pakietu. Oto przykład, który wybiera pakiet do odinstalowania na podstawie jego nazwy; W niektórych przypadkach filtrowanie za pomocą liczby identyfikującej może być łatwiejsze:

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

Usuwanie innych aplikacji nie jest takie proste, nawet w przypadku, gdy jest wykonywane lokalnie. Możemy znaleźć ciągi dezinstalacji wiersza polecenia dla tych aplikacji, wyodrębniając właściwość UninstallString. Ta metoda działa w Windows instalatora i starszych programów wyświetlanych w obszarze Odinstaluj klucz:

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

Dane wyjściowe można filtrować według nazwy wyświetlanej, jeśli chcesz:

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

Jednak te ciągi mogą nie być bezpośrednio używane w wierszu polecenia programu PowerShell bez pewnych modyfikacji.

Uaktualnianie Windows instalatora

Aby uaktualnić aplikację, musisz znać nazwę aplikacji i ścieżkę do pakietu uaktualnienia aplikacji. Dzięki tym informacjom można uaktualnić aplikację za pomocą jednego polecenia programu PowerShell:

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