Gestione delle installazioni di softwareWorking with Software Installations

Le applicazioni progettate per l'uso di Windows Installer sono accessibili tramite la classe Win32_Product di WMI, ma non tutte le applicazioni oggi disponibili prevedono l'uso di Windows Installer.Applications that are designed to use Windows Installer can be accessed through WMI's Win32_Product class, but not all applications in use today use the Windows Installer. Le applicazioni che prevedono l'uso di procedure di installazione alternative non vengono in genere gestite da Windows Installer.Applications that use alternate setup routines are not usually managed by the Windows Installer. Le tecniche specifiche per la gestione di queste applicazioni variano in base al software del programma di installazione e alle decisioni prese dallo sviluppatore.Specific techniques for working with those applications depends on the installer software and decisions made by the application developer. Ad esempio, le applicazioni istallate copiando i file in una cartella sul computer non possono in genere essere gestite con le tecniche descritte in questo articolo.For example, applications installed by copying the files to a folder on the computer usually cannot be managed by using techniques discussed here. È possibile gestire tali applicazioni come file e cartelle usando le tecniche descritte in Gestione di file e cartelle.You can manage these applications as files and folders by using the techniques discussed in Working With Files and Folders.

Attenzione

La classe Win32_Product non è ottimizzata per le query.The Win32_Product class is not query optimized. Le query che usano filtri con caratteri jolly fanno in modo che WMI usi il provider MSI per enumerare tutti i prodotti installati e quindi analizzare l'elenco completo in sequenza per gestire il filtro.Queries that use wildcard filters cause WMI to use the MSI provider to enumerate all installed products then parse the full list sequentially to handle the filter. Verrà anche avviata una verifica coerenza dei pacchetti installati, che verificherà e ripristinerà l'installazione.This also initiates a consistency check of packages installed, verifying and repairing the install. La convalida è un processo lento che potrebbe restituire errori nei registri eventi.The validation is a slow process and may result in errors in the event logs. Per altre informazioni, vedere l' articolo 974524 della Microsoft Knowledge Base.For more information seek KB article 974524.

Visualizzazione di un elenco di applicazioni di Windows InstallerListing Windows Installer Applications

Per elencare le applicazioni installate con Windows Installer in un sistema locale o remoto, usare la semplice query WMI seguente:To list the applications installed with the Windows Installer on a local or remote system, use the following simple WMI query:

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…

Per visualizzare tutte le proprietà dell'oggetto Win32_Product , usare il parametro Properties dei cmdlet di formattazione, ad esempio il cmdlet Format-List, con il valore * (tutti).To display all the properties of the Win32_Product object to the display, use the Properties parameter of the formatting cmdlets, such as the Format-List cmdlet, with a value of * (all).

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

Oppure è possibile usare il parametro Filter di Get-CimInstance per selezionare solo Microsoft .NET 2.0 Runtime.Or, you could use the Get-CimInstance Filter parameter to select only Microsoft .NET 2.0 Runtime. Il valore del parametro Filter usa la sintassi WQL (WMI Query Language), non la sintassi di Windows PowerShell.The value of the Filter parameter uses WMI Query Language (WQL) syntax, not Windows PowerShell syntax. Ad esempio:For example:

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

Per elencare solo le proprietà desiderate, usare il parametro Property dei cmdlet di formattazione.To list only the properties that interest you, use the Property parameter of the formatting cmdlets to list the desired properties.

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}

Visualizzazione di un elenco di tutte le applicazioni disinstallabiliListing All Uninstallable Applications

Poiché la maggior parte delle applicazioni standard registra un programma di disinstallazione con Windows, è possibile gestirle localmente trovandole nel Registro di sistema di Windows.Because most standard applications register an uninstaller with Windows, we can work with those locally by finding them in the Windows registry. Non esiste un modo certo per trovare tutte le applicazioni in un sistema.There is no guaranteed way to find every application on a system. È tuttavia possibile trovare tutti i programmi con gli elenchi visualizzati in Installazione applicazioni nella chiave del Registro di sistema seguente:However, it is possible to find all programs with listings displayed in Add or Remove Programs in the following registry key:

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

È possibile esaminare questa chiave per trovare applicazioni.We can examine this key to find applications. Per semplificare la visualizzazione della chiave Uninstall, è possibile eseguire il mapping di un'unità di PowerShell a questo percorso del Registro di sistema:To make it easier to view the Uninstall key, we can map a PowerShell drive to this registry location:

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

In questo caso diventa disponibile un'unità "Uninstall:" che è possibile usare per cercare le applicazioni installate in modo rapido e immediato.We now have a drive named "Uninstall:" that can be used to quickly and conveniently look for application installations. È possibile trovare il numero di applicazioni installate contando il numero delle chiavi del Registro di sistema nell'unità di PowerShell Uninstall:We can find the number of installed applications by counting the number of registry keys in the Uninstall: PowerShell drive:

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

È possibile eseguire altre ricerche nell'elenco di applicazioni usando varie tecniche, a partire da Get-ChildItem.We can search this list of applications further by using a variety of techniques, beginning with Get-ChildItem. Per ottenere un elenco di applicazioni e salvarlo nella variabile $UninstallableApplications, usare il comando seguente:To get a list of applications and save them in the $UninstallableApplications variable, use the following command:

$UninstallableApplications = Get-ChildItem -Path Uninstall:

Per visualizzare i valori delle voci del Registro di sistema nelle chiavi sotto Uninstall, usare il metodo GetValue delle chiavi del Registro di sistema.To display the values of the registry entries in the registry keys under Uninstall, use the GetValue method of the registry keys. Il valore del metodo corrisponde al nome della voce del Registro di sistema.The value of the method is the name of the registry entry.

Per trovare ad esempio i nomi visualizzati delle applicazioni nella chiave Uninstall, usare il comando seguente:For example, to find the display names of applications in the Uninstall key, use the following command:

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

Non c'è nessuna garanzia che questi valori siano univoci.There is no guarantee that these values are unique. Nell'esempio seguente due elementi installati vengono visualizzati come "Windows Media Encoder 9 Series":In the following example, two installed items appear as "Windows Media Encoder 9 Series":

$UninstallableApplications | Where-Object -FilterScript {
  $_.GetValue("DisplayName") -eq "Microsoft Silverlight"
}
    Hive: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall

Name                           Property
----                           --------
{89F4137D-6C26-4A84-BDB8-2E5A4 AuthorizedCDFPrefix :
BB71E00}                       Comments            :
                               Contact             :
                               DisplayVersion      : 5.1.50918.0
                               HelpLink            : https://go.microsoft.com/fwlink/?LinkID=91955
                               HelpTelephone       :
                               InstallDate         : 20190115
                               InstallLocation     : C:\Program Files\Microsoft Silverlight\
                               InstallSource       : c:\ef64c54526db9c34cd477c103e68a254\
                               ModifyPath          : MsiExec.exe /X{89F4137D-6C26-4A84-BDB8-2E5A4BB71E00}
                               NoModify            : 1
                               NoRepair            : 1
                               Publisher           : Microsoft Corporation
                               Readme              :
                               Size                :
                               EstimatedSize       : 236432
                               UninstallString     : MsiExec.exe /X{89F4137D-6C26-4A84-BDB8-2E5A4BB71E00}
                               URLInfoAbout        :
                               URLUpdateInfo       :
                               VersionMajor        : 5
                               VersionMinor        : 1
                               WindowsInstaller    : 1
                               Version             : 84002534
                               Language            : 1033
                               DisplayName         : Microsoft Silverlight
                               sEstimatedSize2     : 79214

Installazione di applicazioniInstalling Applications

È possibile usare la classe Win32_Product per installare i pacchetti di Windows Installer, in remoto o in locale.You can use the Win32_Product class to install Windows Installer packages, remotely or locally.

Nota

Per installare un'applicazione, è necessario avviare PowerShell con l'opzione "Esegui come amministratore".To install an application, you must start PowerShell with the "Run as administrator" option.

Per l'installazione in remoto, usare un percorso di rete UNC (Universal Naming Convention) per specificare il percorso del pacchetto MSI, perché il sottosistema WMI non riconosce i percorsi di PowerShell.When installing remotely, use a Universal Naming Convention (UNC) network path to specify the path to the .msi package, because the WMI subsystem does not understand PowerShell paths. Ad esempio, per installare il pacchetto NewPackage.msi situato nella condivisione di rete \\AppServ\dsp nel computer remoto PC01, digitare il comando seguente al prompt di PowerShell:For example, to install the NewPackage.msi package located in the network share \\AppServ\dsp on the remote computer PC01, type the following command at the PowerShell prompt:

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

Per le applicazioni che non usano la tecnologia Windows Installer possono essere disponibili metodi specifici per la distribuzione automatizzata.Applications that do not use Windows Installer technology may have application-specific methods for automated deployment. Vedere la documentazione dell'applicazione o usare il sistema di supporto del vendor dell'applicazione.Check the documentation for the application or consult the application vendor's support system.

Rimozione di applicazioniRemoving Applications

La procedura per rimuovere un pacchetto Windows Installer usando PowerShell è molto simile a quella per installarlo.Removing a Windows Installer package using PowerShell works in approximately the same way as installing a package. Ecco un esempio in cui il pacchetto da disinstallare viene selezionato in base al nome. In alcuni casi può risultare più semplice applicare un filtro con IdentifyingNumber :Here is an example that selects the package to uninstall based on its name; in some cases it may be easier to filter with the IdentifyingNumber :

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

La rimozione di altre applicazioni non è altrettanto semplice, neanche se viene eseguita in locale.Removing other applications is not quite so simple, even when done locally. Per trovare le stringhe di disinstallazione dalla riga di comando per queste applicazioni, estrarre la proprietà UninstallString .We can find the command line uninstallation strings for these applications by extracting the UninstallString property. Questo metodo funziona per le applicazioni di Windows Installer e per i programmi meno recenti visualizzati nella chiave Uninstall:This method works for Windows Installer applications and for older programs appearing under the Uninstall key:

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

Se si preferisce, è possibile filtrare l'output in base al nome visualizzato:You can filter the output by the display name, if you like:

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

Tuttavia, queste stringhe potrebbero non essere utilizzabili direttamente al prompt di PowerShell senza apportare alcune modifiche.However, these strings may not be directly usable from the PowerShell prompt without some modification.

Aggiornamento delle applicazioni di Windows InstallerUpgrading Windows Installer Applications

Per aggiornare un'applicazione, è necessario conoscerne il nome e il percorso del pacchetto di aggiornamento.To upgrade an application, you need to know the name of the application and the path to the application upgrade package. Con queste informazioni, è possibile aggiornare un'applicazione con un singolo comando di PowerShell:With that information, you can upgrade an application with a single PowerShell command:

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