Jämför fjärrutdata med lokala utdata
När du kör ett kommando som Get-Process på den lokala datorn returnerar kommandot objekt eller objekt av typen System.Diagnostics.Process och lägger till dem i Windows PowerShell-pipelinen. Dessa objekt har egenskaper, metoder och ofta händelser. Metoder ger möjlighet att utföra uppgifter. Metoden Kill() för ett processobjekt avslutar till exempel den process som objektet representerar.
Kommentar
Processen att konvertera ett objekt till ett formulär som lätt kan transporteras kallas serialisering. Serialiseringen tar ett objekts tillstånd och omvandlar det till seriedataformat, till exempel XML eller binärt format. Deserialisering konverterar formaterad XML eller binära data till en objekttyp.
När ett kommando körs på en fjärrdator serialiserar datorn resultatet i XML och skickar XML-texten till datorn. Du gör detta för att placera objektets information i ett format som kan överföras via ett nätverk. För komplexa objekt kan serialiseringsprocessen dock endast använda statisk information om ett objekt – med andra ord dess egenskaper.
När datorn tar emot XML-koden deserialiseras den tillbaka till objekt som placeras i Windows PowerShell-pipelinen. När du har ett Process-objekt och dirigerar det till Get-Member, vet du att det nu är av typen Deserialized.System.Diagnostics.Process, ett relaterat, men annorlunda, objekt. Det deserialiserade objektet har inga metoder och inga händelser.
Med tanke på serialiseringen och deserialiseringen som ingår i PowerShell-fjärrkommunikation bör du betrakta alla objekt som hämtas på det här sättet som en statisk ögonblicksbild. Värdena för objektegenskaperna är inte uppdaterbara och objekten kan inte användas för att utföra några åtgärder. Därför bör alla uppgifter som kräver interaktion med fjärrobjekt utföras på fjärrdatorn som en del av PowerShell-fjärrkommunikationssessionen.
Här är till exempel ett exempel på ett kommando som inte ger önskat resultat:
Invoke-Command –Computer LON-DC1 –ScriptBlock { Get-Process –Name Note* } |
Stop-Process
I det här exemplet hämtar du Process-objekt, men uppgiften att stoppa processer sker på den lokala datorn i stället för den fjärranslutna. Detta resulterar i att alla lokala processer som råkar ha namnen som matchar fjärrprocesserna stoppas.
Det rätta sättet att uppnå det avsedda resultatet är att köra:
Invoke-Command –Computer LON-DC1 –ScriptBlock { Get-Process –Name Note* |
Stop-Process }
I det här fallet har bearbetningen skett helt på fjärrdatorn, där endast de slutliga resultaten serialiseras och skickas tillbaka. Skillnaden mellan dessa två kommandon är diskret men viktig att förstå.