Exercise 1: Why $procs[0].Kill() Fails — Possible Solution ==================================================================== WHY .ProcessName WORKS BUT .Kill() DOESN'T ------------------------------ Per this chapter, an object returned from Invoke-Command is serialized into XML to cross the network from the remote machine, then deserialized back into a PowerShell object locally - and deserialization can only reconstruct DATA (properties), not BEHAVIOR (methods). .ProcessName is a property - a piece of data that was captured and successfully carried across in that XML snapshot, so reading it works fine locally. .Kill() is a method - actual executable behavior tied to the real, live System.Diagnostics.Process object that still exists only on the remote machine. That live object, and its ability to terminate a process, never actually left the remote machine at all; $procs[0] locally is only a detailed, read-only snapshot of what that object looked like at the moment it was captured. THE Deserialized. TYPE PREFIX AS THE SIGNAL ------------------------------ Per this chapter, $procs[0].GetType().Name reports "Deserialized.System.Diagnostics.Process" rather than plain "System.Diagnostics.Process" - the Deserialized. prefix is PowerShell's own explicit signal that this object is a snapshot, not a live remote handle, which is exactly why calling Kill() on it fails. WHY THIS WORKS AS AN ANSWER ------------------------------ It correctly distinguishes properties (data, which survives deserialization) from methods (behavior, which does not), correctly explains that the real live object never left the remote machine, and correctly connects this to the Deserialized. type prefix as the visible confirmation.