remote-management

Manage remote Windows servers via WinRM, PowerShell remoting, and SSH. Use when user needs to execute commands on remote hosts or establish remote sessions.

allowed_tools: windows-command-line, console-automation

$ Installer

git clone https://github.com/majiayu000/claude-skill-registry /tmp/claude-skill-registry && cp -r /tmp/claude-skill-registry/skills/development/remote-management ~/.claude/skills/claude-skill-registry

// tip: Run this command in your terminal to install the skill


name: remote-management description: "Manage remote Windows servers via WinRM, PowerShell remoting, and SSH. Use when user needs to execute commands on remote hosts or establish remote sessions." license: MIT compatibility:

  • copilot-cli
  • vscode-copilot
  • claude allowed-tools:
  • windows-command-line
  • console-automation

Remote Server Management Skill

When to Activate

  • User mentions: remote, WinRM, PSRemoting, Enter-PSSession, Invoke-Command, SSH
  • User wants to run commands on another server
  • User needs to manage multiple servers at once

Prerequisites

Enable WinRM on Target

# On target server (run as admin)
Enable-PSRemoting -Force
Set-Item WSMan:\localhost\Client\TrustedHosts -Value "*" -Force  # Or specific hosts

Verify Connectivity

Test-WSMan -ComputerName $remoteHost
Test-NetConnection -ComputerName $remoteHost -Port 5985  # HTTP
Test-NetConnection -ComputerName $remoteHost -Port 5986  # HTTPS

Remote Execution Patterns

Single Command to Single Host

Invoke-Command -ComputerName $remoteHost -ScriptBlock {
    Get-Process | Sort-Object CPU -Descending | Select-Object -First 5
}

Single Command to Multiple Hosts

$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

Interactive Session

# Enter interactive session
Enter-PSSession -ComputerName $remoteHost

# Exit when done
Exit-PSSession

With Credentials

$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))

Pass Variables to Remote

$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
}

Copy Files to Remote

# 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 Alternative (OpenSSH)

Connect via SSH

ssh user@$remoteHost

# Run single command
ssh user@$remoteHost "Get-Process | Select -First 5"

PowerShell over SSH

# Requires OpenSSH and PowerShell subsystem configured
Enter-PSSession -HostName $remoteHost -UserName $username -SSHTransport

Parallel Execution (PS 7+)

$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

Troubleshooting WinRM

ErrorSolution
"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 timeoutCheck firewall (5985/5986), network path
# Diagnose WinRM issues
winrm quickconfig
winrm get winrm/config/client