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.