Con le interfacce .NET Framework e COM sono disponibili componenti software che consentono di eseguire molte attività di amministrazione del sistema. L'utilizzo di questi componenti è consentito in Windows PowerShell, ampliando pertanto il numero di attività eseguibili tramite i cmdlet. Molti dei cmdlet inclusi nella versione iniziale di Windows PowerShell non funzionano con i computer remoti. Verrà illustrato come risolvere questo problema durante la gestione dei registri eventi mediante la classe System.Diagnostics.EventLog di .NET Framework direttamente da Windows PowerShell.

Utilizzo di New-Object per l'accesso ai registri eventi

Nella libreria di classi .NET Framework è inclusa una classe denominata System.Diagnostics.EventLog che può essere utilizzata per gestire i registri eventi. È possibile creare una nuova istanza di una classe .NET Framework utilizzando il cmdlet New-Object con il parametro TypeName. Il comando seguente consente ad esempio di creare un riferimento al registro eventi:

PS> New-Object -TypeName System.Diagnostics.EventLog

  Max(K) Retain OverflowAction        Entries Name
  ------ ------ --------------        ------- ----

Sebbene tramite il comando sia stata creata un'istanza della classe EventLog, tale istanza non include dati perché non è stato specificato un registro eventi specifico. Di seguito verrà spiegato come ottenere un registro eventi effettivo.

Utilizzo di costruttori con New-Object

Per fare riferimento a un registro eventi specifico, è necessario indicare il nome del registro. New-Object dispone di un parametro ArgumentList. Gli argomenti passati come valori di questo parametro vengono utilizzati da uno speciale metodo di avvio dell'oggetto. Questo metodo è denominato costruttore perché consente di costruire l'oggetto. Ad esempio, per ottenere un riferimento al registro Application, è necessario specificare come argomento la stringa 'Application':

PS> New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application

Max(K) Retain OverflowAction        Entries Name
------ ------ --------------        ------- ----
16,384      7 OverwriteOlder          2,160 Application
Nota

Poiché la maggior parte delle classi di base di .NET Framework è inclusa nello spazio dei nomi System, in Windows PowerShell si tenterà automaticamente di trovare le classi specificate nello spazio dei nomi System se non viene trovata alcuna corrispondenza per il nome di tipo specificato. È quindi possibile specificare Diagnostics.EventLog anziché System.Diagnostics.EventLog.

Archiviazione di oggetti nelle variabili

È possibile archiviare un riferimento a un oggetto affinché sia possibile utilizzarlo nella shell corrente. Sebbene in Windows PowerShell sia possibile eseguire molte operazioni con le pipeline, evitando il ricorso alle variabili, talvolta l'archiviazione di riferimenti a oggetti semplifica notevolmente la modifica di tali oggetti.

Windows PowerShell consente di creare variabili che rappresentano essenzialmente oggetti denominati. L'output restituito da qualsiasi comando valido di Windows PowerShell può essere archiviato in una variabile. I nomi di variabile iniziano sempre con il carattere $. Se si desidera archiviare il riferimento al registro dell'applicazione in una variabile denominata $AppLog, digitare il nome della variabile seguito da un segno di uguale, quindi digitare il comando utilizzato per creare l'oggetto registro dell'applicazione:

PS> $AppLog = New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application

Se quindi si digita $AppLog, sarà possibile notare che include il registro dell'applicazione:

PS> $AppLog

  Max(K) Retain OverflowAction        Entries Name
  ------ ------ --------------        ------- ----
  16,384      7 OverwriteOlder          2,160 Application

Accesso a un registro eventi remoto con New-Object

I comandi utilizzati nella sezione precedente considerano come destinazione il computer locale. Questa operazione è supportata dal cmdlet Get-EventLog. Per accedere al registro dell'applicazione in un computer locale, è necessario specificare come argomenti sia il nome del registro che un nome di computer (oppure l'indirizzo IP).

PS> $RemoteAppLog = New-Object -TypeName System.Diagnostics.EventLog Application,192.168.1.81
PS> $RemoteAppLog

  Max(K) Retain OverflowAction        Entries Name
  ------ ------ --------------        ------- ----
     512      7 OverwriteOlder            262 Application

Una volta creato un riferimento a un registro eventi archiviato nella variabile $RemoteAppLog, a questo punto verranno esaminate le attività eseguibili su di esso.

Cancellazione di un registro eventi con i metodi degli oggetti

Agli oggetti sono spesso associati metodi che è possibile chiamare per eseguire attività. È possibile utilizzare Get-Member per visualizzare i metodi associati a un oggetto. Nel comando e nell'output selezionato riportati di seguito sono illustrati alcuni metodi della classe EventLog:

PS> $RemoteAppLog | Get-Member -MemberType Method


   TypeName: System.Diagnostics.EventLog

Name                      MemberType Definition
----                      ---------- ----------
...
Clear                     Method     System.Void Clear()
Close                     Method     System.Void Close()
...
GetType                   Method     System.Type GetType()
...
ModifyOverflowPolicy      Method     System.Void ModifyOverflowPolicy(Overfl...
RegisterDisplayName       Method     System.Void RegisterDisplayName(String ...
...
ToString                  Method     System.String ToString()
WriteEntry                Method     System.Void WriteEntry(String message),...
WriteEvent                Method     System.Void WriteEvent(EventInstance in...

Il metodo Clear() può essere utilizzato per cancellare il registro eventi. Quando si chiama un metodo, è necessario specificare le parentesi di apertura e chiusura dopo il nome del metodo, anche se per il metodo non è necessario indicare argomenti. In questo modo sarà possibile fare distinzione tra il metodo e una proprietà potenziale avente lo stesso nome. Per chiamare il metodo Clear, digitare:

PS> $RemoteAppLog.Clear()

Digitare invece quanto segue per visualizzare il registro. Si noterà che il registro eventi è stato cancellato e contiene ora 0 voci anziché 262:

PS> $RemoteAppLog

  Max(K) Retain OverflowAction        Entries Name
  ------ ------ --------------        ------- ----
     512      7 OverwriteOlder              0 Application

Creazione di oggetti COM con New-Object

New-Object consente di utilizzare i componenti COM (Component Object Model). Tali componenti possono essere costituiti dalle diverse librerie incluse in Windows Script Host (WSH) o da applicazioni ActiveX, quali Internet Explorer, installate nella maggior parte dei sistemi.

New-Object utilizza i Runtime Callable Wrapper di .NET Framework per creare oggetti COM. In questo modo, si hanno le stesse limitazioni presenti in .NET Framework quando vengono chiamati oggetti COM. Per creare un oggetto COM, è necessario specificare il parametro ComObject con il ProgID della classe COM che si desidera utilizzare. Le limitazioni previste per l'utilizzo di COM e l'individuazione dei ProgID disponibili in un sistema non rientrano tra gli argomenti trattati nella presente documentazione, tuttavia è importante sapere che in Windows PowerShell è possibile utilizzare la maggior parte degli oggetti più noti di ambienti quali WSH.

È possibile creare gli oggetti WSH specificando i ProgID WScript.Shell, WScript.Network, Scripting.Dictionary e Scripting.FileSystemObject. con i comandi seguenti:

New-Object -ComObject WScript.Shell
New-Object -ComObject WScript.Network
New-Object -ComObject Scripting.Dictionary
New-Object -ComObject Scripting.FileSystemObject

Sebbene sia possibile utilizzare altre tecniche per rendere disponibile la maggior parte delle funzionalità di tali classi in Windows PowerShell, alcune attività, tra cui la creazione di collegamenti, risulta più agevole tramite le classi WSH.

Creazione di un collegamento sul desktop con WScript.Shell

La creazione di collegamenti è una delle attività che è possibile eseguire rapidamente tramite un oggetto COM. Si supponga di voler creare sul desktop un collegamento alla home directory di Windows PowerShell. È innanzitutto necessario creare un riferimento a WScript.Shell che verrà archiviato in una variabile denominata $WshShell:

$WshShell = New-Object -ComObject WScript.Shell

Poiché Get-Member può essere utilizzato con oggetti COM, è possibile esplorare i membri dell'oggetto digitando:

PS> $WshShell | Get-Member


   TypeName: System.__ComObject#{41904400-be18-11d3-a28b-00104bd35090}

Name                     MemberType            Definition
----                     ----------            ----------
AppActivate              Method                bool AppActivate (Variant, Va...
CreateShortcut           Method                IDispatch CreateShortcut (str...
...

Get-Member dispone di un parametro InputObject facoltativo che è possibile utilizzare anziché eseguire il reindirizzamento per fornire l'input a Get-Member. L'output ottenuto sarà identico a quello riportato sopra anche se è stato utilizzato il comando Get-Member -InputObject $WshShell. Se si utilizza InputObject, il relativo argomento verrà considerato come un unico elemento. Di conseguenza, se una variabile include più oggetti, Get-Member li considererà come una matrice di oggetti. Ad esempio:

PS> $a = 1,2,"three"
PS> Get-Member -InputObject $a
TypeName: System.Object[]
Name               MemberType    Definition
----               ----------    ----------
Count              AliasProperty Count = Length
...

Il metodo WScript.Shell CreateShortcut accetta un unico argomento, ovvero il percorso del file di collegamento da creare. È possibile digitare il percorso completo del desktop, tuttavia è disponibile una tecnica più semplice. Il desktop è in genere rappresentato da una cartella denominata Desktop e inclusa nella home directory dell'utente corrente. In Windows PowerShell è disponibile una variabile $Home che include il percorso di questa cartella. È possibile utilizzare questa variabile per specificare il percorso della home directory e quindi aggiungere il nome della cartella Desktop e il nome del collegamento da creare digitando:

$lnk = $WshShell.CreateShortcut("$Home\Desktop\PSHome.lnk")

Quando si utilizza un valore simile a un nome di variabile racchiuso tra virgolette doppie, Windows PowerShell tenta di sostituirlo con un valore corrispondente. Per evitare il tentativo di sostituzione, è sufficiente utilizzare le virgolette semplici. Provare ad esempio ad eseguire i comandi seguenti:

PS> "$Home\Desktop\PSHome.lnk"
C:\Documents and Settings\aka\Desktop\PSHome.lnk
PS> '$Home\Desktop\PSHome.lnk'
$Home\Desktop\PSHome.lnk

A questo punto si dispone di una variabile denominata $lnk che include un nuovo riferimento al collegamento. Per visualizzarne i membri, è possibile reindirizzarla a Get-Member. Nell'output riportato di seguito sono indicati i membri da utilizzare per completare la creazione del collegamento:

PS> $lnk | Get-Member

TypeName: System.__ComObject#{f935dc23-1cf0-11d0-adb9-00c04fd58a0b}

Name MemberType Definition

---- ---------- ----------

...

Save Method void Save ()

...

TargetPath Property string TargetPath () {get} {set}

...

È necessario specificare il parametro TargetPath, ovvero la cartella dell'applicazione di Windows PowerShell, quindi salvare il collegamento $lnk chiamando il metodo Save. Il percorso della cartella dell'applicazione di Windows PowerShell è archiviato nella variabile $PSHome, pertanto per eseguire l'operazione è necessario digitare:

$lnk.TargetPath = $PSHome

$lnk.Save()

Utilizzo di Internet Explorer da Windows PowerShell

È possibile utilizzare COM per automatizzare molte applicazioni, inclusa la famiglia di applicazioni di Microsoft Office e Internet Explorer. Internet Explorer consente di illustrare alcune delle tecniche e dei problemi tipici associati all'utilizzo di applicazioni basate su COM.

Per creare un'istanza di Internet Explorer, è possibile specificarne il relativo ProgID, ovvero InternetExplorer.Application:

$ie = New-Object -ComObject InternetExplorer.Application

Questo comando consente di avviare Internet Explorer, ma non di renderlo visibile. Se si digita Get-Process, si nota che è in esecuzione un processo denominato iexplore che rimarrà in esecuzione anche se si esce da Windows PowerShell. Per terminare il processo iexplore, sarà necessario riavviare il computer o utilizzare un'utilità come Gestione attività.

Nota

All'avvio, gli oggetti COM che vengono avviati come processi separati, denominati in genere eseguibili ActiveX, potrebbero visualizzare o meno una finestra dell'interfaccia utente. Se consentono di creare una finestra ma non di renderla visibile, come nel caso di Internet Explorer, lo stato attivo verrà in genere spostato sul desktop di Windows e sarà necessario rendere visibile la finestra per potervi interagire.

Digitando $ie | Get-Member, è possibile visualizzare proprietà e metodi per Internet Explorer. Per visualizzare la finestra di Internet Explorer, impostare la proprietà Visible su $true digitando:

$ie.Visible = $true

Sarà quindi possibile connettersi a un indirizzo Web specifico utilizzando il metodo Navigate:

$ie.Navigate("http://www.microsoft.com/technet/scriptcenter/default.mspx")

Utilizzando altri membri del modello a oggetti di Internet Explorer, è possibile recuperare contenuto di testo della pagina Web. Il comando seguente consente di visualizzare il testo HTML presente nel corpo della pagina Web corrente:

$ie.Document.Body.InnerText

Per chiudere Internet Explorer dall'interno di PowerShell, chiamare il relativo metodo Quit():

$ie.Quit()

In tal modo si forzerà la chiusura di Internet Explorer. La variabile $ie non contiene più un riferimento valido sebbene sembri ancora essere un oggetto COM. Se si tenta di utilizzarla, verrà restituito un errore di automazione:

PS> $ie | Get-Member
Get-Member : Exception retrieving the string representation for property "Appli
cation" : "The object invoked has disconnected from its clients. (Exception fro
m HRESULT: 0x80010108 (RPC_E_DISCONNECTED))"
At line:1 char:16
+ $ie | Get-Member <<<<

È possibile rimuovere il riferimento rimanente con un comando simile a $ie = $null, oppure rimuovere completamente la variabile digitando:

Remove-Variable ie
Nota

Non è disponibile uno standard comune che consenta di stabilire se l'esecuzione degli eseguibili ActiveX debba continuare o essere interrotta quando si rimuove il riferimento a uno di essi. L'applicazione verrà chiusa a seconda delle circostanze, ad esempio se è o meno visibile, se in essa viene eseguito un documento modificato e persino se Windows PowerShell è ancora in esecuzione. Per tale motivo, è consigliabile testare il comportamento di chiusura di ogni eseguibile ActiveX che si desidera utilizzare in Windows PowerShell.

Visualizzazione di avvisi su oggetti COM con wrapper .NET Framework

In alcuni casi, è possibile che a un oggetto COM sia associato un Runtime Callable Wrapper o RCW di .NET Framework che verrà utilizzato da New-Object. Poiché il comportamento dell'RCW potrebbe differire da quello del normale oggetto COM, New-Object dispone di un parametro Strict che avvisa l'utente dell'accesso a RCW. Se si specifica il parametro Strict e si crea un oggetto COM che utilizza un RCW, verrà visualizzato un messaggio di avviso:

PS> $xl = New-Object -ComObject Excel.Application -Strict
New-Object : The object written to the pipeline is an instance of the type "Mic
rosoft.Office.Interop.Excel.ApplicationClass" from the component's primary inte
rop assembly. If this type exposes different members than the IDispatch members
, scripts written to work with this object might not work if the primary intero
p assembly is not installed.
At line:1 char:17
+ $xl = New-Object  <<<< -ComObject Excel.Application -Strict

L'oggetto verrà comunque creato ma si verrà avvisati che non si tratta di un oggetto COM standard.




Argomenti della Guida