Confrontare l'output remoto con l'output locale

Completato

Quando si esegue un comando come Get-Process nel computer locale, il comando restituisce oggetti o oggetti di tipo System.Diagnostics.Process e li aggiunge alla pipeline di Windows PowerShell. Questi oggetti sono associati a proprietà, a metodi e, spesso, a eventi. I metodi consentono di eseguire attività. Ad esempio, il metodo Kill() di un oggetto Process determina la terminazione del processo rappresentato da tale oggetto.

Nota

Il processo di conversione di un oggetto in un formato che può essere agevolmente trasportato è denominato serializzazione. La serializzazione accetta lo stato di un oggetto e lo trasforma in un formato dati seriale, ad esempio XML, o in un formato binario. Il processo di deserializzazione converte i dati in formato XML o in formato binario in un tipo di oggetto.

Quando un comando viene eseguito in un computer remoto, il computer serializza i risultati in formato XML e trasmette il testo XML al computer in uso. Questo processo è utile per specificare le informazioni riguardanti l'oggetto in un formato trasmissibile in rete. In caso di oggetti complessi, tuttavia, il processo di serializzazione può usare solo le informazioni statiche dell’oggetto, ovvero le proprietà dell'oggetto.

Quando il computer in uso riceve il testo XML, tale testo viene deserializzato in oggetti e questi vengono inseriti nella pipeline di Windows PowerShell. Si supponga di disporre di un oggetto Process. Mediante l'invio tramite pipe di tale oggetto a Get-Member, l'oggetto diventa di tipo Deserialized.System.Diagnostics.Process,vale a dire un oggetto di tipo correlato a quello precedente, ma non identico. L'oggetto deserializzato non è associato ad alcun metodo o evento.

Poiché la serializzazione e la deserializzazione sono parti integranti della comunicazione remota di PowerShell, è consigliabile considerare tutti gli oggetti ottenuti in questo modo come se fossero snapshot statici. I valori delle proprietà dell'oggetto non sono aggiornabili e gli oggetti non possono essere usati per alcuna azione. Pertanto, tutte le attività che richiedono l'interazione con oggetti remoti dovranno essere eseguite nel computer remoto nel contesto della sessione remota di PowerShell.

Di seguito è riportato un esempio di comando che non genera i risultati desiderati:

Invoke-Command –Computer LON-DC1 –ScriptBlock { Get-Process –Name Note* } |
Stop-Process

In questo esempio gli oggetti Process vengono recuperati, ma l'attività di arresto dei processi viene eseguita nel computer locale anziché in quello remoto. Di conseguenza, verranno arrestati tutti i processi locali che hanno nomi corrispondenti a quelli remoti.

Il modo corretto per ottenere il risultato desiderato consiste nell'eseguire:

Invoke-Command –Computer LON-DC1 –ScriptBlock { Get-Process –Name Note* |
Stop-Process }

In questo caso, l'elaborazione è stata eseguita interamente nel computer remoto e solo i risultati finali sono stati serializzati e re-inviati. La differenza tra questi due comandi è sottile, ma deve essere tenuta presente.