Le applicazioni progettate per l'utilizzo di Windows Installer sono accessibili tramite la classe Win32_Product di WMI. Tuttavia Windows Installer non viene utilizzato in tutte le applicazioni oggi disponibili. Poiché Windows Installer include la più vasta gamma di tecniche standard per la gestione di applicazioni installabili, l'attenzione sarà concentrata principalmente su tali applicazioni. Le applicazioni basate su routine di installazione alternative non vengono in genere gestite tramite Windows Installer. Le tecniche specifiche per la gestione di tali applicazioni dipenderanno dal software del programma di installazione e delle decisioni dello sviluppatore dell'applicazione.

Nota

Le applicazioni che vengono installate copiando i relativi file nel computer non possono in genere essere gestite utilizzando le tecniche illustrate in questo manuale. È possibile gestire queste applicazioni come file e cartelle utilizzando le tecniche illustrate nella sezione "Utilizzo di file e cartelle".

Visualizzazione dell'elenco delle applicazioni basate su Windows Installer

Per elencare le applicazioni installate con Windows Installer in un sistema locale o remoto, utilizzare la semplice query WMI riportata di seguito:

PS> Get-WmiObject -Class Win32_Product -ComputerName .
IdentifyingNumber : {7131646D-CD3C-40F4-97B9-CD9E4E6262EF}
Name              : Microsoft .NET Framework 2.0
Vendor            : Microsoft Corporation
Version           : 2.0.50727
Caption           : Microsoft .NET Framework 2.0

Per visualizzare tutte le proprietà dell'oggetto Win32_Product, utilizzare il parametro Properties dei cmdlet di formattazione, come Format-List, con il valore * (tutti).

PS> Get-WmiObject -Class Win32_Product -ComputerName . | Where-Object -FilterScript {$_.Name -eq "Microsoft .NET Framework 2.0"} | Format-List -Property *
Name              : Microsoft .NET Framework 2.0
Version           : 2.0.50727
InstallState      : 5
Caption           : Microsoft .NET Framework 2.0
Description       : Microsoft .NET Framework 2.0
IdentifyingNumber : {7131646D-CD3C-40F4-97B9-CD9E4E6262EF}
InstallDate       : 20060506
InstallDate2      : 20060506000000.000000-000
InstallLocation   :
PackageCache      : C:\WINDOWS\Installer\619ab2.msi
SKUNumber         :
Vendor            : Microsoft Corporation

Oppure è possibile utilizzare il parametro Get-WmiObject Filter per selezionare solo Microsoft .NET Framework 2.0. Poiché il filtro utilizzato in questo comando è un filtro WMI, viene utilizzata la sintassi WQL (WMI Query Language) e non la sintassi di Windows PowerShell. Quindi:

Get-WmiObject -Class Win32_Product -ComputerName . -Filter "Name='Microsoft .NET Framework 2.0'"| Format-List -Property *

Si noti che nelle query WQL vengono frequentemente utilizzati caratteri, tra cui spazi o segni di uguale, che hanno uno speciale significato in Windows PowerShell. Per tale motivo è opportuno racchiudere sempre tra virgolette il valore del parametro Filter. È inoltre possibile utilizzare il carattere di escape di Windows PowerShell, ovvero un apice inverso (`), sebbene potrebbe risultare poco leggibile. Il seguente comando è equivalente al precedente e restituisce gli stessi risultati, tuttavia utilizza l'apice inverso come escape dei caratteri speciali, anziché racchiudere tra virgolette l'intera stringa di filtro.

Get-WmiObject -Class Win32_Product -ComputerName . -Filter Name`=`'Microsoft` .NET` Framework` 2.0`' | Format-List -Property *

Per elencare solo le proprietà che interessano, utilizzare il parametro Property dei cmdlet di formattazione per elencare le proprietà desiderate.

Get-WmiObject -Class Win32_Product -ComputerName . | Format-List -Property Name,InstallDate,InstallLocation,PackageCache,Vendor,Version,IdentifyingNumber
...
Name              : HighMAT Extension to Microsoft Windows XP CD Writing Wizard
InstallDate       : 20051022
InstallLocation   : C:\Program Files\HighMAT CD Writing Wizard\
PackageCache      : C:\WINDOWS\Installer\113b54.msi
Vendor            : Microsoft Corporation
Version           : 1.1.1905.1
IdentifyingNumber : {FCE65C4E-B0E8-4FBD-AD16-EDCBE6CD591F}
...

Infine, per trovare solo i nomi delle applicazioni installate, una semplice istruzione Format-Wide semplifica l'output:

Get-WmiObject -Class Win32_Product -ComputerName .  | Format-Wide -Column 1

Sebbene siano disponibili diverse tecniche per visualizzare l'elenco delle applicazioni per la cui installazione è stato utilizzato Windows Installer, non sono state considerate finora altre applicazioni. Poiché il programma di disinstallazione della maggior parte delle applicazioni standard viene registrato in Windows, è possibile gestire queste applicazioni nel computer locale individuandole nel Registro di sistema di Windows.

Visualizzazione dell'elenco di tutte le applicazioni disinstallabili

Sebbene non sia disponibile una tecnica garantita per individuare tutte le applicazioni disponibili in un sistema, è possibile individuare tutti i programmi utilizzando gli elenchi visualizzati nella finestra di dialogo Installazione applicazioni. Tramite Installazione applicazioni è possibile trovare queste applicazioni nella chiave del Registro di sistema seguente:

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

È anche possibile esaminare la chiave per trovare le applicazioni. Per visualizzare più agevolmente la chiave Uninstall, è possibile effettuare il mapping di un'unità Windows PowerShell a un percorso del Registro di sistema:

PS>    

Name       Provider      Root                                   CurrentLocation
----       --------      ----                                   ---------------
Uninstall  Registry      HKEY_LOCAL_MACHINE\SOFTWARE\Micr...
Nota

L'unità HKLM: è mappata alla radice di HKEY_LOCAL_MACHINE, pertanto è stata utilizzata tale unità nel percorso della chiave Uninstall. Anziché HKLM: sarebbe stato possibile specificare il percorso del Registro di sistema utilizzando HKLM o HKEY_LOCAL_MACHINE. Il vantaggio associato all'utilizzo di un'unità del Registro di sistema esistente è dato dalla possibilità di utilizzare la funzionalità di completamento tramite TAB per inserire i nomi delle chiavi senza doverli digitare.

A questo punto si disporrà di un'unità denominata "Uninstall" che può essere utilizzata per cercare in modo rapido e comodo le installazioni delle applicazioni. Per individuare il numero di applicazioni installate, è possibile contare il numero di chiavi del Registro di sistema presenti nell'unità Uninstall: di Windows PowerShell:

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

È possibile eseguire ulteriori ricerche in questo elenco di applicazioni utilizzando diverse tecniche, a partire da Get-ChildItem. Per ottenere un elenco di applicazioni e salvarle nella variabile $UninstallableApplications, utilizzare il comando seguente:

$UninstallableApplications = Get-ChildItem -Path Uninstall:
Nota

Per chiarezza verrà utilizzato un nome di variabile lungo. In condizioni normali non è necessario utilizzare nomi lunghi. Sebbene sia possibile utilizzare la funzione di completamento tramite TAB per i nomi di variabili, per maggior rapidità è possibile specificare nomi composti da uno o due caratteri. Nomi descrittivi e più lunghi sono maggiormente utili quando si sviluppa codice che si intende riutilizzare.

Per visualizzare i valori delle voci del Registro di sistema nelle chiavi del Registro di sistema in Uninstall, utilizzare il metodo GetValue delle chiavi. Il valore del metodo è il nome della voce del Registro di sistema.

Ad esempio, per individuare i nomi visualizzati delle applicazioni nella chiave Uninstall, utilizzare il comando seguente:

PS> Get-ChildItem -Path Uninstall: | ForEach-Object -Process { $_.GetValue("DisplayName") }

Non viene garantito che questi valori siano univoci. Nell'esempio seguente tra i programmi installati verranno visualizzate due occorrenze di "Windows Media Encoder 9 Series":

PS> Get-ChildItem -Path Uninstall: | Where-Object -FilterScript { $_.GetValue("DisplayName") -eq "Windows Media Encoder 9 Series"}


   Hive: Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Micros
oft\Windows\CurrentVersion\Uninstall

SKC  VC Name                           Property
---  -- ----                           --------
  0   3 Windows Media Encoder 9        {DisplayName, DisplayIcon, UninstallS...
  0  24 {E38C00D0-A68B-4318-A8A6-F7... {AuthorizedCDFPrefix, Comments, Conta...

Installazione di applicazioni

È possibile utilizzare la classe Win32_Product per installare pacchetti di Windows Installer in remoto o nel computer locale. Quando si esegue un'installazione in remoto, è necessario utilizzare un percorso di rete UNC (Universal Naming Convention) per specificare il percorso del pacchetto con estensione msi poiché il sottosistema WMI non riconosce i percorsi di Windows PowerShell. Ad esempio, per installare il pacchetto NewPackage.msi presente nella condivisione di rete \\AppServ\dsp del computer remoto PC01, digitare il comando seguente al prompt di Windows PowerShell:

(Get-WMIObject -ComputerName PC01 -List | Where-Object -FilterScript {$_.Name -eq "Win32_Product"}).Install(\\AppSrv\dsp\NewPackage.msi)

Nel caso delle applicazioni che non utilizzano la tecnologia Windows Installer è possibile che siano disponibili metodologie specifiche per la distribuzione automatizzata. Per sapere se sono disponibili metodologie per la distribuzione automatizzata, consultare la documentazione dell'applicazione oppure rivolgersi al servizio di assistenza del fornitore dell'applicazione. In alcuni casi, anche se il fornitore dell'applicazione non ha progettato specificamente l'applicazione per automatizzarne l'installazione, è possibile che il produttore del software del programma di installazione metta a disposizione alcune tecniche per l'automazione.

Rimozione di applicazioni

La procedura di rimozione di un pacchetto di Windows Installer con Windows PowerShell è piuttosto simile a quella di installazione di un pacchetto. Nell'esempio seguente il pacchetto da disinstallare verrà scelto in base al nome. In alcuni casi potrebbe risultare più semplice filtrare i risultati con IdentifyingNumber:

(Get-WmiObject -Class Win32_Product -Filter "Name='ILMerge'" -ComputerName . ).Uninstall()

La rimozione di altre applicazioni non è così semplice anche quando viene eseguita nel computer locale. Per individuare le stringhe per disinstallare tali applicazioni dalla riga di comando, è possibile estrarre la proprietà UninstallString. Questa tecnica è valida per applicazioni basate su Windows Installer e per programmi meno recenti indicati nella chiave Uninstall:

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

Se si desidera, è possibile filtrare l'output in base al nome visualizzato:

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

Non è tuttavia possibile utilizzare queste stringhe direttamente dal prompt di Windows PowerShell senza alcune modifiche.

Aggiornamento delle applicazioni basate su Windows Installer

Per aggiornare un'applicazione, è necessario conoscere il nome dell'applicazione e il percorso del pacchetto di aggiornamento dell'applicazione. Se si dispone di tali informazioni, è possibile eseguire l'aggiornamento di un'applicazione con un solo comando di Windows PowerShell:

(Get-WmiObject -Class Win32_Product -ComputerName . -Filter "Name='OldAppName'").Upgrade(\\AppSrv\dsp\OldAppUpgrade.msi)




Argomenti della Guida