#!/usr/bin/env bash set -euo pipefail HOST="${HOST:-192.168.88.108}" USER_NAME="${USER_NAME:-Admin}" PASS="${PASS:-P@ssw0rd!}" echo "=== Testing WinRM Connection to $HOST ===" echo "" # Test 1: Check if PowerShell Core is installed echo "[1/4] Checking PowerShell Core availability..." if command -v pwsh >/dev/null 2>&1; then echo "✅ PowerShell Core found: $(pwsh --version)" else echo "❌ PowerShell Core not found" echo "Install with: brew install powershell" exit 1 fi # Test 2: Test basic network connectivity to WinRM port echo "" echo "[2/4] Testing network connectivity to WinRM port 5985..." if nc -z "$HOST" 5985; then echo "✅ Port 5985 is reachable" else echo "❌ Cannot reach port 5985 on $HOST" exit 1 fi # Test 3: Test HTTP WinRM endpoint with curl echo "" echo "[3/4] Testing WinRM HTTP endpoint..." WINRM_RESPONSE=$(curl -s -w "%{http_code}" -o /dev/null --max-time 10 \ "http://$HOST:5985/wsman" \ -H "Content-Type: application/soap+xml;charset=UTF-8" \ -H "SOAPAction: http://schemas.xmlsoap.org/ws/2004/09/enumeration/Enumerate" \ --data 'SELECT * FROM Win32_Service' 2>/dev/null || echo "000") if [ "$WINRM_RESPONSE" = "401" ]; then echo "✅ WinRM endpoint responding (401 = authentication required, expected)" elif [ "$WINRM_RESPONSE" = "500" ]; then echo "✅ WinRM endpoint responding (500 = server error, but WinRM is there)" else echo "⚠️ WinRM endpoint response: $WINRM_RESPONSE (may still work with PowerShell)" fi # Test 4: Test PowerShell remoting echo "" echo "[4/4] Testing PowerShell remoting session..." pwsh -c " try { \$secpass = ConvertTo-SecureString '$PASS' -AsPlainText -Force \$cred = New-Object System.Management.Automation.PSCredential('$USER_NAME', \$secpass) Write-Host 'Attempting to create PowerShell session...' \$sessionOption = New-PSSessionOption -SkipCACheck -SkipCNCheck \$session = New-PSSession -ComputerName '$HOST' -Port 5985 -Credential \$cred -UseSSL:\$false -SessionOption \$sessionOption -ErrorAction Stop Write-Host '✅ PowerShell remoting session created successfully' # Test running a simple command \$result = Invoke-Command -Session \$session -ScriptBlock { @{ ComputerName = \$env:COMPUTERNAME UserName = \$env:USERNAME PSVersion = \$PSVersionTable.PSVersion.ToString() CurrentTime = Get-Date -Format 'yyyy-MM-dd HH:mm:ss' } } Write-Host 'Remote session info:' Write-Host ' Computer:' \$result.ComputerName Write-Host ' User:' \$result.UserName Write-Host ' PowerShell:' \$result.PSVersion Write-Host ' Time:' \$result.CurrentTime Remove-PSSession \$session Write-Host '✅ Session closed successfully' } catch { Write-Host '❌ PowerShell remoting failed:' \$_.Exception.Message Write-Host '' Write-Host 'Common causes:' Write-Host ' - AllowUnencrypted=false (current setting on target)' Write-Host ' - Firewall blocking connections' Write-Host ' - Network connectivity issues' Write-Host ' - Authentication problems' exit 1 } " echo "" echo "🎉 All WinRM connectivity tests passed!" echo "" echo "WinRM is ready for use. You can now:" echo " 1. Create WinRM-based versions of existing scripts" echo " 2. Use PowerShell remoting for direct command execution" echo " 3. Compare performance with SSH-based approach"