Files
powershell-scripts/winrm-https/Test-ShopfloorPC.ps1
cproudlock 62c0c7bb06 Initial commit: Organized PowerShell scripts for ShopDB asset collection
Structure:
- asset-collection/: Local PC data collection scripts
- remote-execution/: WinRM remote execution scripts
- setup-utilities/: Configuration and testing utilities
- registry-backup/: GE registry backup scripts
- winrm-https/: WinRM HTTPS certificate setup
- docs/: Complete documentation

Each folder includes a README with detailed documentation.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-10 10:57:54 -05:00

295 lines
14 KiB
PowerShell

#Requires -Version 5.1
<#
.SYNOPSIS
Quick test script for WinRM HTTPS connections to shopfloor PCs
.DESCRIPTION
This script tests WinRM HTTPS connectivity to shopfloor PCs.
Run this from your management computer to verify deployed PCs are working.
.PARAMETER ComputerName
Hostname of the PC to test (without domain suffix)
Example: g9kn7pz3esf
.PARAMETER SkipCertificateCheck
Skip SSL certificate validation (use for self-signed certs)
.PARAMETER Interactive
Open an interactive PowerShell session after successful test
.EXAMPLE
# Basic test
.\Test-ShopfloorPC.ps1 -ComputerName g9kn7pz3esf
.EXAMPLE
# Test and open interactive session
.\Test-ShopfloorPC.ps1 -ComputerName g9kn7pz3esf -Interactive
.EXAMPLE
# Test with certificate check skipped
.\Test-ShopfloorPC.ps1 -ComputerName g9kn7pz3esf -SkipCertificateCheck
.NOTES
Author: System Administrator
Date: 2025-10-17
Domain: logon.ds.ge.com
Port: 5986 (WinRM HTTPS)
#>
param(
[Parameter(Mandatory=$true, Position=0)]
[string]$ComputerName,
[Parameter(Mandatory=$false)]
[switch]$SkipCertificateCheck,
[Parameter(Mandatory=$false)]
[switch]$Interactive
)
# Configuration
$Domain = "logon.ds.ge.com"
$Port = 5986
# Remove domain suffix if user included it
$ComputerName = $ComputerName -replace "\.$Domain$", ""
# Construct FQDN
$FQDN = "$ComputerName.$Domain"
# Banner
Write-Host ""
Write-Host "╔══════════════════════════════════════════════════════════════╗" -ForegroundColor Cyan
Write-Host "║ WinRM HTTPS Connection Test - Shopfloor PC ║" -ForegroundColor Cyan
Write-Host "╚══════════════════════════════════════════════════════════════╝" -ForegroundColor Cyan
Write-Host ""
Write-Host "Target PC: $FQDN" -ForegroundColor White
Write-Host "Port: $Port" -ForegroundColor White
Write-Host "Time: $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')" -ForegroundColor White
Write-Host ""
# Session options
$sessionOption = $null
if ($SkipCertificateCheck) {
Write-Host "[INFO] Skipping SSL certificate validation" -ForegroundColor Yellow
$sessionOption = New-PSSessionOption -SkipCACheck -SkipCNCheck
Write-Host ""
}
# Test 1: Basic network connectivity
Write-Host "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" -ForegroundColor Gray
Write-Host "TEST 1: Network Connectivity" -ForegroundColor Yellow
Write-Host "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" -ForegroundColor Gray
try {
$ping = Test-Connection $FQDN -Count 2 -ErrorAction Stop
$avgTime = ($ping.ResponseTime | Measure-Object -Average).Average
Write-Host "✓ PC is reachable" -ForegroundColor Green
Write-Host " Average response time: $([math]::Round($avgTime, 2))ms" -ForegroundColor Gray
} catch {
Write-Host "✗ Cannot reach PC" -ForegroundColor Red
Write-Host " Error: $($_.Exception.Message)" -ForegroundColor Red
Write-Host ""
Write-Host "Troubleshooting:" -ForegroundColor Yellow
Write-Host " • Verify PC is powered on" -ForegroundColor Gray
Write-Host " • Check network connectivity" -ForegroundColor Gray
Write-Host " • Verify hostname spelling" -ForegroundColor Gray
exit 1
}
# Test 2: DNS resolution
Write-Host ""
Write-Host "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" -ForegroundColor Gray
Write-Host "TEST 2: DNS Resolution" -ForegroundColor Yellow
Write-Host "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" -ForegroundColor Gray
try {
$dns = Resolve-DnsName $FQDN -ErrorAction Stop | Where-Object {$_.Type -eq 'A'}
Write-Host "✓ DNS resolution successful" -ForegroundColor Green
Write-Host " IP Address: $($dns.IPAddress)" -ForegroundColor Gray
} catch {
Write-Host "✗ DNS resolution failed" -ForegroundColor Red
Write-Host " Using hostname from ping result" -ForegroundColor Yellow
}
# Test 3: Port connectivity
Write-Host ""
Write-Host "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" -ForegroundColor Gray
Write-Host "TEST 3: Port $Port Connectivity" -ForegroundColor Yellow
Write-Host "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" -ForegroundColor Gray
try {
$portTest = Test-NetConnection -ComputerName $FQDN -Port $Port -WarningAction SilentlyContinue -ErrorAction Stop
if ($portTest.TcpTestSucceeded) {
Write-Host "✓ Port $Port is open and accepting connections" -ForegroundColor Green
} else {
Write-Host "✗ Port $Port is closed or filtered" -ForegroundColor Red
Write-Host ""
Write-Host "Troubleshooting:" -ForegroundColor Yellow
Write-Host " • Verify WinRM HTTPS deployment completed successfully" -ForegroundColor Gray
Write-Host " • Check firewall rules on target PC" -ForegroundColor Gray
Write-Host " • Verify WinRM service is running" -ForegroundColor Gray
exit 1
}
} catch {
Write-Host "✗ Cannot test port connectivity" -ForegroundColor Red
Write-Host " Error: $($_.Exception.Message)" -ForegroundColor Red
}
# Test 4: WinRM HTTPS connectivity
Write-Host ""
Write-Host "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" -ForegroundColor Gray
Write-Host "TEST 4: WinRM HTTPS Service" -ForegroundColor Yellow
Write-Host "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" -ForegroundColor Gray
try {
$testParams = @{
ComputerName = $FQDN
UseSSL = $true
Port = $Port
ErrorAction = 'Stop'
}
if ($sessionOption) {
$testParams.SessionOption = $sessionOption
}
$wsmanTest = Test-WSMan @testParams
Write-Host "✓ WinRM HTTPS is responding" -ForegroundColor Green
Write-Host " Product: $($wsmanTest.ProductVendor)" -ForegroundColor Gray
Write-Host " Version: $($wsmanTest.ProductVersion)" -ForegroundColor Gray
Write-Host " Protocol: $($wsmanTest.ProtocolVersion)" -ForegroundColor Gray
} catch {
Write-Host "✗ WinRM HTTPS not responding" -ForegroundColor Red
Write-Host " Error: $($_.Exception.Message)" -ForegroundColor Red
Write-Host ""
if ($_.Exception.Message -like "*certificate*" -and -not $SkipCertificateCheck) {
Write-Host "Tip: This looks like a certificate trust issue." -ForegroundColor Yellow
Write-Host " Try running with -SkipCertificateCheck flag:" -ForegroundColor Yellow
Write-Host " .\Test-ShopfloorPC.ps1 -ComputerName $ComputerName -SkipCertificateCheck" -ForegroundColor White
}
exit 1
}
# Test 5: Authenticated connection
Write-Host ""
Write-Host "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" -ForegroundColor Gray
Write-Host "TEST 5: Authenticated Remote Command" -ForegroundColor Yellow
Write-Host "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" -ForegroundColor Gray
Write-Host ""
Write-Host "Enter credentials for $FQDN" -ForegroundColor Cyan
$cred = Get-Credential -Message "Enter credentials for $FQDN"
if (-not $cred) {
Write-Host ""
Write-Host "✗ No credentials provided" -ForegroundColor Red
exit 1
}
Write-Host ""
Write-Host "Executing remote command..." -ForegroundColor Gray
try {
$invokeParams = @{
ComputerName = $FQDN
Credential = $cred
UseSSL = $true
Port = $Port
ErrorAction = 'Stop'
ScriptBlock = {
[PSCustomObject]@{
Hostname = $env:COMPUTERNAME
IPAddress = (Get-NetIPAddress -AddressFamily IPv4 |
Where-Object {$_.IPAddress -notlike "127.*" -and $_.IPAddress -notlike "169.254.*"} |
Select-Object -First 1).IPAddress
WinRMStatus = (Get-Service WinRM).Status
OSVersion = (Get-CimInstance Win32_OperatingSystem).Caption
Uptime = (Get-Date) - (Get-CimInstance Win32_OperatingSystem).LastBootUpTime
FreeMemoryGB = [math]::Round((Get-CimInstance Win32_OperatingSystem).FreePhysicalMemory / 1MB, 2)
}
}
}
if ($sessionOption) {
$invokeParams.SessionOption = $sessionOption
}
$remoteInfo = Invoke-Command @invokeParams
Write-Host "✓ Remote command executed successfully" -ForegroundColor Green
Write-Host ""
Write-Host "╔══════════════════════════════════════════════════════════════╗" -ForegroundColor Green
Write-Host "║ REMOTE COMPUTER INFORMATION ║" -ForegroundColor Green
Write-Host "╚══════════════════════════════════════════════════════════════╝" -ForegroundColor Green
Write-Host ""
Write-Host " Hostname: $($remoteInfo.Hostname)" -ForegroundColor White
Write-Host " IP Address: $($remoteInfo.IPAddress)" -ForegroundColor White
Write-Host " OS Version: $($remoteInfo.OSVersion)" -ForegroundColor White
Write-Host " WinRM Status: $($remoteInfo.WinRMStatus)" -ForegroundColor White
Write-Host " Uptime: $($remoteInfo.Uptime.Days) days, $($remoteInfo.Uptime.Hours) hours, $($remoteInfo.Uptime.Minutes) minutes" -ForegroundColor White
Write-Host " Free Memory: $($remoteInfo.FreeMemoryGB) GB" -ForegroundColor White
Write-Host ""
} catch {
Write-Host "✗ Authentication or remote command failed" -ForegroundColor Red
Write-Host " Error: $($_.Exception.Message)" -ForegroundColor Red
Write-Host ""
Write-Host "Troubleshooting:" -ForegroundColor Yellow
Write-Host " • Verify username and password are correct" -ForegroundColor Gray
Write-Host " • Try format: DOMAIN\username or .\localadmin" -ForegroundColor Gray
Write-Host " • Ensure user has Administrator rights on target PC" -ForegroundColor Gray
exit 1
}
# Success summary
Write-Host ""
Write-Host "╔══════════════════════════════════════════════════════════════╗" -ForegroundColor Cyan
Write-Host "║ TEST SUCCESSFUL ║" -ForegroundColor Cyan
Write-Host "╚══════════════════════════════════════════════════════════════╝" -ForegroundColor Cyan
Write-Host ""
Write-Host "All tests passed! WinRM HTTPS is configured correctly." -ForegroundColor Green
Write-Host ""
# Interactive mode
if ($Interactive) {
Write-Host "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" -ForegroundColor Gray
Write-Host "Opening interactive session..." -ForegroundColor Yellow
Write-Host "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" -ForegroundColor Gray
Write-Host ""
Write-Host "Type 'Exit-PSSession' or 'exit' to close the session" -ForegroundColor Gray
Write-Host ""
$sessionParams = @{
ComputerName = $FQDN
Credential = $cred
UseSSL = $true
Port = $Port
}
if ($sessionOption) {
$sessionParams.SessionOption = $sessionOption
}
Enter-PSSession @sessionParams
} else {
Write-Host "Quick Connection Commands:" -ForegroundColor Yellow
Write-Host ""
Write-Host " # Interactive session" -ForegroundColor Gray
if ($SkipCertificateCheck) {
Write-Host " `$sessionOption = New-PSSessionOption -SkipCACheck -SkipCNCheck" -ForegroundColor White
Write-Host " Enter-PSSession -ComputerName $FQDN -Credential `$cred -UseSSL -Port $Port -SessionOption `$sessionOption" -ForegroundColor White
} else {
Write-Host " Enter-PSSession -ComputerName $FQDN -Credential `$cred -UseSSL -Port $Port" -ForegroundColor White
}
Write-Host ""
Write-Host " # Or run this script with -Interactive flag:" -ForegroundColor Gray
Write-Host " .\Test-ShopfloorPC.ps1 -ComputerName $ComputerName -Interactive$(if($SkipCertificateCheck){' -SkipCertificateCheck'})" -ForegroundColor White
Write-Host ""
}