Manage remote Windows servers via WinRM, PowerShell remoting, and SSH. Use when user needs to execute commands on remote hosts or establish remote sessions.
# On target server (run as admin)
Enable-PSRemoting -Force
Set-Item WSMan:\localhost\Client\TrustedHosts -Value "*" -Force # Or specific hosts
Test-WSMan -ComputerName $remoteHost
Test-NetConnection -ComputerName $remoteHost -Port 5985 # HTTP
Test-NetConnection -ComputerName $remoteHost -Port 5986 # HTTPS
Invoke-Command -ComputerName $remoteHost -ScriptBlock {
Get-Process | Sort-Object CPU -Descending | Select-Object -First 5
}
$servers = @('Server01', 'Server02', 'Server03')
Invoke-Command -ComputerName $servers -ScriptBlock {
[PSCustomObject]@{
Host = $env:COMPUTERNAME
Uptime = (Get-Date) - (Get-CimInstance Win32_OperatingSystem).LastBootUpTime
FreeMemGB = [math]::Round((Get-CimInstance Win32_OperatingSystem).FreePhysicalMemory / 1MB, 2)
}
} | Select-Object Host, Uptime, FreeMemGB
# Enter interactive session
Enter-PSSession -ComputerName $remoteHost
# Exit when done
Exit-PSSession
$cred = Get-Credential
Invoke-Command -ComputerName $remoteHost -Credential $cred -ScriptBlock { whoami }
# Or use stored credential
$cred = New-Object PSCredential("DOMAIN\User", (ConvertTo-SecureString "password" -AsPlainText -Force))
$serviceName = "Spooler"
Invoke-Command -ComputerName $remoteHost -ScriptBlock {
param($svc)
Get-Service -Name $svc
} -ArgumentList $serviceName
# Or using $using: scope (PS 3.0+)
Invoke-Command -ComputerName $remoteHost -ScriptBlock {
Get-Service -Name $using:serviceName
}
# Using PS remoting session
$session = New-PSSession -ComputerName $remoteHost
Copy-Item -Path "C:\local\file.txt" -Destination "C:\remote\" -ToSession $session
Remove-PSSession $session
ssh user@$remoteHost
# Run single command
ssh user@$remoteHost "Get-Process | Select -First 5"
# Requires OpenSSH and PowerShell subsystem configured
Enter-PSSession -HostName $remoteHost -UserName $username -SSHTransport
$servers = @('Server01', 'Server02', 'Server03', 'Server04', 'Server05')
$servers | ForEach-Object -Parallel {
Invoke-Command -ComputerName $_ -ScriptBlock {
[PSCustomObject]@{
Server = $env:COMPUTERNAME
CPU = (Get-CimInstance Win32_Processor).LoadPercentage
}
}
} -ThrottleLimit 5
| Error | Solution |
|---|---|
| "WinRM cannot complete the operation" | Enable WinRM: Enable-PSRemoting -Force |
| "Access denied" | Check credentials, group membership |
| "The WinRM client cannot process the request" | Add to TrustedHosts or use HTTPS |
| Connection timeout | Check firewall (5985/5986), network path |
# Diagnose WinRM issues
winrm quickconfig
winrm get winrm/config/client