Remoting and PSSessions
By the end of this lesson you'll run commands on remote machines with Invoke-Command, drop into an interactive remote prompt with Enter-PSSession, reuse persistent connections via New-PSSession, fan a command out across many servers at once, and pass local data into remote blocks with $using: — the foundation of real infrastructure automation.
Learn Remoting and PSSessions in our free PowerShell course — an interactive lesson with worked examples, a practice exercise and a quick reference.
Part of the free Powershell course at LearnCodingFast — hands-on lessons with examples you run in your browser, plus practice exercises and a quick quiz.
Remoting is like having remote control of other computers. Enter-PSSession is a video call — you're "in the room" on one machine, typing live. Invoke-Command is sending a task by courier — you hand over a sealed instruction (the script block), it's carried out on the far end, and the results are couriered back to you. New-PSSession is keeping the phone line open so you don't redial for every message, and $using: is writing your local notes into the instruction so the remote worker has the details they need.
1. Running Commands Remotely with Invoke-Command
Invoke-Command is the workhorse of remoting. You give it -ComputerName (where to run) and a -ScriptBlock (what to run); the block executes on the remote machine and the results come back to you as objects, each tagged with a PSComputerName property. Read this worked example, then run it against a host you control.
2. Interactive Sessions with Enter-PSSession
When you want to "go there and look around" one machine, Enter-PSSession drops you into an interactive remote prompt. Your prompt changes to show the remote host, every command you type runs there, and Exit-PSSession brings you home. Supply credentials with -Credential (Get-Credential) . This is ideal for single-machine troubleshooting; for automation across many hosts, reach for Invoke-Command instead.
Now you try. Fill in the one blank using the hint in the comment, then run it.
3. Persistent Connections with New-PSSession
Passing -ComputerName opens a throwaway connection per call. For repeated work, create a persistent session with New-PSSession and pass it to Invoke-Command -Session . Reuse is faster and keeps state between calls — a variable set in one call is still there in the next. Always Remove-PSSession when you finish to free resources on both ends.
On Windows, remoting rides on WinRM (enable it once with Enable-PSRemoting ). In PowerShell 7 you can also remote over SSH with -HostName instead of -ComputerName , which works cross-platform to Linux and macOS. Pick WinRM inside a Windows domain; pick SSH when you need to cross operating systems.
The two features that make remoting scale: give -ComputerName a list and the block runs on every machine in parallel ; and use the $using: scope modifier to push a local variable into the remote block (a remote session can't see your local variables otherwise).
Each returned object carries PSComputerName , so even though all three ran at once you always know which host produced which row.
No blanks this time — just a brief and an outline to keep you on track. Build it, run it (against lab hosts), and check your output against the example in the comments. Fanning a check out across servers is everyday infrastructure work.
Practice quiz
What does PowerShell Remoting let you do?
- Run commands on remote computers
- Compress archives
- Format strings
- Edit local files faster
Answer: Run commands on remote computers. Remoting runs PowerShell commands and scripts on one or many remote machines from your local session.
Which cmdlet runs a script block on a remote computer?
- Get-Process
- Enter-Session
- Invoke-Command
- Start-Process
Answer: Invoke-Command. Invoke-Command -ComputerName <name> -ScriptBlock { ... } runs the block remotely and returns the results.
Which cmdlet opens an interactive one-to-one remote session?
- Invoke-Command
- Enter-PSSession
- Connect-Host
- New-PSSession
Answer: Enter-PSSession. Enter-PSSession starts an interactive session so your prompt operates on the remote machine until you Exit-PSSession.
What does New-PSSession create?
- A new local window
- A scheduled task
- A log file
- A persistent reusable connection to a remote host
Answer: A persistent reusable connection to a remote host. New-PSSession creates a persistent PSSession you can reuse across multiple Invoke-Command calls.
Which cmdlet closes and cleans up a PSSession?
- Remove-PSSession
- Stop-Session
- Close-PSSession
- Exit-Session
Answer: Remove-PSSession. Remove-PSSession disconnects and removes a session, freeing resources on both ends.
On Windows, which protocol is the traditional remoting transport?
- FTP
- WinRM
- SMTP
- Telnet
Answer: WinRM. WinRM (Windows Remote Management) is the default transport for PowerShell remoting on Windows.
Which transport enables cross-platform PowerShell remoting?
- HTTP only
- RDP
- SMB
- SSH
Answer: SSH. PowerShell 7 supports SSH-based remoting, letting you connect across Windows, Linux, and macOS.
How do you supply alternate credentials to a remote command?
- -Login
- -User
- -Credential
- -Password
Answer: -Credential. The -Credential parameter accepts a PSCredential so you can authenticate as a different user.
What does Invoke-Command do when given many computer names?
- Errors out
- Runs the command on all of them in parallel
- Runs them one at a time slowly
- Picks one at random
Answer: Runs the command on all of them in parallel. Invoke-Command fans out and runs the script block on all listed computers concurrently.
Inside a remote script block, how do you use a LOCAL variable?
- Prefix it with $using:
- Use $remote:
- It is impossible
- Just type $var
Answer: Prefix it with $using:. The $using: scope modifier passes a local variable into the remote script block, e.g. $using:path.