20 KiB
Getting Started with WinRM HTTPS
This guide will walk you through setting up WinRM HTTPS for your shopfloor PCs step-by-step, from testing on a single device to full deployment across all 175 shopfloor computers.
Table of Contents
- Prerequisites
- Phase 1: Single Device Test
- Phase 2: Small Batch Test
- Phase 3: Full Deployment
- Daily Operations
- Troubleshooting
Prerequisites
What You Need
- Windows computer with PowerShell 5.1 or later
- Administrator access to target computers
- Network connectivity to shopfloor PCs
- Domain credentials with admin rights
- All files from the
winrm-httpsfolder
Prepare Your Environment
-
Copy the folder to your Windows computer:
Copy the entire winrm-https folder to: C:\Scripts\winrm-https\ -
Open PowerShell as Administrator:
- Press Windows + X
- Select "Windows PowerShell (Admin)" or "Terminal (Admin)"
-
Navigate to the folder:
cd C:\Scripts\winrm-https -
Set execution policy (if needed):
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser -Force
Phase 1: Single Device Test
Step 1.1: Generate Test Certificate
What this does: Creates a self-signed wildcard certificate for *.logon.ds.ge.com that will work on all shopfloor PCs.
# Run the certificate generator
.\Generate-WildcardCert.ps1
You will be prompted for:
- Certificate password (enter it twice)
- Install to Trusted Root? (Type
Yfor testing)
Expected output:
=== Generating Self-Signed Wildcard Certificate ===
Domain: *.logon.ds.ge.com
Validity: 2 years
Creating certificate...
[OK] Certificate created successfully
Certificate Details:
Subject: CN=*.logon.ds.ge.com
Thumbprint: ABC123...
Valid From: 2025-10-17
Valid To: 2027-10-17
Has Private Key: True
=== Exporting Certificate to PFX ===
Export path: C:\Scripts\winrm-https\wildcard-logon-ds-ge-com-20251017.pfx
[OK] Certificate exported successfully
[SUCCESS] Wildcard certificate generation completed!
Result: You now have a PFX file (e.g., wildcard-logon-ds-ge-com-20251017.pfx)
Step 1.2: Test on Your Local Computer
What this does: Tests the complete WinRM HTTPS setup on your current computer.
# Run the automated test
.\Test-WinRM-HTTPS-Setup.ps1
What happens:
- Uses the certificate you just generated
- Installs it on your computer
- Creates HTTPS listener on port 5986
- Configures Windows Firewall
- Tests the connection
- Shows results
Expected output:
╔════════════════════════════════════════╗
║ WinRM HTTPS Test Setup Wizard ║
╚════════════════════════════════════════╝
Current computer: YOUR-PC-NAME
Target FQDN: your-pc-name.logon.ds.ge.com
STEP 1: Generate Wildcard Certificate
[OK] Certificate generated: wildcard-logon-ds-ge-com-20251017.pfx
STEP 2: Configure WinRM HTTPS
[OK] WinRM HTTPS setup completed
STEP 3: Verify WinRM Configuration
[OK] WinRM service is running
[OK] HTTPS listener configured
STEP 4: Test Local HTTPS Connection
[OK] Local HTTPS connection successful
Test setup complete!
If you see errors:
- Ensure you're running PowerShell as Administrator
- Check Windows Firewall is not blocking port 5986
- See Troubleshooting section below
Step 1.3: Test Remote Connection
What this does: Tests connecting to your computer from PowerShell using HTTPS.
# Get your computer's FQDN
$hostname = $env:COMPUTERNAME
$fqdn = "$hostname.logon.ds.ge.com"
# Test WinRM HTTPS
Test-WSMan -ComputerName $fqdn -UseSSL -Port 5986
# NOTE: See SECURE_CREDENTIAL_MANAGEMENT.md for secure password handling
# Try creating a remote session
$sessionOption = New-PSSessionOption -SkipCACheck -SkipCNCheck
$session = New-PSSession -ComputerName $fqdn -UseSSL -Port 5986 -SessionOption $sessionOption
# If successful, test running a command
Invoke-Command -Session $session -ScriptBlock {
Write-Host "Successfully connected via WinRM HTTPS!"
Get-ComputerInfo | Select-Object CsName, OsName, WindowsVersion
}
# Clean up
Remove-PSSession $session
Expected output:
Successfully connected via WinRM HTTPS!
CsName OsName WindowsVersion
------ ------ --------------
YOUR-PC Microsoft Windows 11 Pro 10.0.22631
** Success!** If this works, you're ready to move to the next phase.
Phase 2: Small Batch Test
Step 2.1: Select Test Computers
Choose 3-5 shopfloor PCs for initial testing.
# View available shopfloor PCs
Get-Content .\shopfloor-hostnames.txt | Select-Object -First 10
Create a test list:
# Create a small test file
@"
G1JJVH63ESF
G1JJXH63ESF
G1JKYH63ESF
"@ | Out-File -FilePath .\test-hostnames.txt -Encoding ASCII
Step 2.2: Deploy Certificate to Test PCs
Option A: Manual Deployment (Recommended for first test)
For each test PC:
-
Copy certificate to the PC:
# Replace HOSTNAME with actual hostname $hostname = "G1JJVH63ESF" $targetPath = "\\$hostname.logon.ds.ge.com\C$\Temp\WinRM-Setup" # Create directory New-Item -Path $targetPath -ItemType Directory -Force # Copy files Copy-Item ".\wildcard-logon-ds-ge-com-*.pfx" -Destination $targetPath Copy-Item ".\Setup-WinRM-HTTPS.ps1" -Destination $targetPath -
Run setup on the PC:
# Connect to the PC (if WinRM HTTP is available) Enter-PSSession -ComputerName "$hostname.logon.ds.ge.com" # Or physically/RDP to the PC and run: cd C:\Temp\WinRM-Setup # SECURE: Let script prompt for password .\Setup-WinRM-HTTPS.ps1 -CertificatePath ".\wildcard-logon-ds-ge-com-20251017.pfx" ` -Domain "logon.ds.ge.com" # (Will prompt: "Enter certificate password:") # OR use stored password (see SECURE_CREDENTIAL_MANAGEMENT.md)
Option B: Remote Deployment (If existing access available)
# If you already have WinRM HTTP or admin access
$testPCs = Get-Content .\test-hostnames.txt
# SECURE: Use stored password or let script prompt
# See SECURE_CREDENTIAL_MANAGEMENT.md for details
$certPass = Import-Clixml -Path "C:\Secure\cert-password.xml"
$cred = Get-Credential # Domain admin credentials
foreach ($hostname in $testPCs) {
$fqdn = "$hostname.logon.ds.ge.com"
Write-Host "Deploying to $fqdn..." -ForegroundColor Yellow
# Copy files via network share
$remotePath = "\\$fqdn\C$\Temp\WinRM-Setup"
New-Item -Path $remotePath -ItemType Directory -Force
Copy-Item ".\wildcard-*.pfx" -Destination $remotePath
Copy-Item ".\Setup-WinRM-HTTPS.ps1" -Destination $remotePath
# Execute remotely (requires existing WinRM/admin access)
Invoke-Command -ComputerName $fqdn -Credential $cred -ScriptBlock {
param($CertPath, $CertPass, $Domain)
Set-Location C:\Temp\WinRM-Setup
.\Setup-WinRM-HTTPS.ps1 -CertificatePath $CertPath `
-CertificatePassword $CertPass -Domain $Domain
} -ArgumentList "C:\Temp\WinRM-Setup\wildcard-logon-ds-ge-com-20251017.pfx", $certPass, "logon.ds.ge.com"
}
Step 2.3: Test HTTPS Connections
# Test connections to your test PCs
.\Invoke-RemoteAssetCollection-HTTPS.ps1 `
-HostnameListFile ".\test-hostnames.txt" `
-Domain "logon.ds.ge.com" `
-TestConnections
Expected output:
=== Remote Asset Collection Script (HTTPS) ===
Target computers (FQDNs): G1JJVH63ESF.logon.ds.ge.com, G1JJXH63ESF.logon.ds.ge.com...
Resolving IP addresses...
Resolving G1JJVH63ESF.logon.ds.ge.com... [10.134.48.12]
Resolving G1JJXH63ESF.logon.ds.ge.com... [10.134.48.13]
Testing HTTPS connections only...
Testing G1JJVH63ESF.logon.ds.ge.com... [OK]
Testing G1JJXH63ESF.logon.ds.ge.com... [OK]
Testing G1JKYH63ESF.logon.ds.ge.com... [OK]
If you see failures:
- Check DNS resolution
- Verify certificate is installed on target PC
- Check firewall rules
- See Troubleshooting
Step 2.4: Test Asset Collection
# Run actual asset collection on test PCs
.\Invoke-RemoteAssetCollection-HTTPS.ps1 `
-HostnameListFile ".\test-hostnames.txt" `
-Domain "logon.ds.ge.com"
You will be prompted for credentials (use domain admin account)
Expected output:
Validating remote HTTPS connections and script availability...
Validating G1JJVH63ESF.logon.ds.ge.com... [OK]
Validating G1JJXH63ESF.logon.ds.ge.com... [OK]
Starting asset collection on 3 computers...
Max concurrent sessions: 5
Using HTTPS on port: 5986
Processing batch: G1JJVH63ESF.logon.ds.ge.com, G1JJXH63ESF.logon.ds.ge.com...
[OK] G1JJVH63ESF.logon.ds.ge.com - Completed successfully
[OK] G1JJXH63ESF.logon.ds.ge.com - Completed successfully
[OK] G1JKYH63ESF.logon.ds.ge.com - Completed successfully
=== Collection Summary ===
Total computers: 3
Successful: 3
Failed: 0
Collection completed. Success: 3, Failed: 0
** Success!** If this works, you're ready for full deployment.
Phase 3: Full Deployment
Step 3.1: Plan Deployment
Deployment strategies:
Option A: Rolling Deployment (Recommended)
- Deploy to 10-20 PCs at a time
- Verify each batch before continuing
- Minimize risk, easier troubleshooting
Option B: Mass Deployment
- Deploy to all 175 PCs at once
- Faster but higher risk
- Requires good preparation
We recommend Option A for first deployment.
Step 3.2: Create Deployment Batches
# Split hostnames into batches of 20
$allHostnames = Get-Content .\shopfloor-hostnames.txt
$batchSize = 20
$batchNumber = 1
for ($i = 0; $i -lt $allHostnames.Count; $i += $batchSize) {
$batch = $allHostnames[$i..([Math]::Min($i + $batchSize - 1, $allHostnames.Count - 1))]
$batchFile = ".\batch-$batchNumber.txt"
$batch | Out-File -FilePath $batchFile -Encoding ASCII
Write-Host "Created $batchFile with $($batch.Count) hosts"
$batchNumber++
}
Result: Creates files like batch-1.txt, batch-2.txt, etc.
Step 3.3: Deploy Batch 1
# Deploy certificate to first batch
$batch1 = Get-Content .\batch-1.txt
$certPass = ConvertTo-SecureString "YourPassword" -AsPlainText -Force
foreach ($hostname in $batch1) {
Write-Host "Deploying to $hostname..." -ForegroundColor Cyan
try {
# Copy files
$targetPath = "\\$hostname.logon.ds.ge.com\C$\Temp\WinRM-Setup"
New-Item -Path $targetPath -ItemType Directory -Force -ErrorAction Stop
Copy-Item ".\wildcard-*.pfx" -Destination $targetPath -ErrorAction Stop
Copy-Item ".\Setup-WinRM-HTTPS.ps1" -Destination $targetPath -ErrorAction Stop
Write-Host " [OK] Files copied" -ForegroundColor Green
}
catch {
Write-Host " [FAIL] $($_.Exception.Message)" -ForegroundColor Red
}
}
Step 3.4: Execute Setup on Batch 1
Option A: Remote Execution
$cred = Get-Credential # Get credentials once
$batch1 = Get-Content .\batch-1.txt
foreach ($hostname in $batch1) {
$fqdn = "$hostname.logon.ds.ge.com"
Write-Host "Setting up WinRM HTTPS on $fqdn..." -ForegroundColor Yellow
try {
Invoke-Command -ComputerName $fqdn -Credential $cred -ScriptBlock {
param($CertPath, $CertPass, $Domain)
Set-Location C:\Temp\WinRM-Setup
.\Setup-WinRM-HTTPS.ps1 -CertificatePath $CertPath `
-CertificatePassword $CertPass -Domain $Domain
} -ArgumentList "C:\Temp\WinRM-Setup\wildcard-logon-ds-ge-com-20251017.pfx", $certPass, "logon.ds.ge.com"
Write-Host " [OK] Setup completed" -ForegroundColor Green
}
catch {
Write-Host " [FAIL] $($_.Exception.Message)" -ForegroundColor Red
}
}
Option B: Group Policy / SCCM
- Deploy via your organization's deployment tools
- Use startup script to run Setup-WinRM-HTTPS.ps1
Step 3.5: Verify Batch 1
# Test connections
.\Invoke-RemoteAssetCollection-HTTPS.ps1 `
-HostnameListFile ".\batch-1.txt" `
-Domain "logon.ds.ge.com" `
-TestConnections
# Review results
Write-Host "`nPress any key to continue with next batch or Ctrl+C to stop..."
$null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
Step 3.6: Continue with Remaining Batches
# Repeat steps 3.3-3.5 for each batch
$batchFiles = Get-ChildItem .\batch-*.txt | Sort-Object Name
foreach ($batchFile in $batchFiles) {
Write-Host "`n========================================" -ForegroundColor Cyan
Write-Host "Processing $($batchFile.Name)" -ForegroundColor Cyan
Write-Host "========================================" -ForegroundColor Cyan
# Run deployment and verification for this batch
# (Use steps 3.3-3.5)
Write-Host "`nBatch complete. Continue? (Y/N)" -ForegroundColor Yellow
$continue = Read-Host
if ($continue -ne 'Y') { break }
}
Step 3.7: Final Verification
# Test all 175 shopfloor PCs
.\Invoke-RemoteAssetCollection-HTTPS.ps1 `
-HostnameListFile ".\shopfloor-hostnames.txt" `
-Domain "logon.ds.ge.com" `
-TestConnections
# Review summary
Write-Host "`n=== Deployment Summary ===" -ForegroundColor Cyan
Write-Host "Check the log file for details:"
Write-Host ".\logs\remote-collection-https.log"
Daily Operations
Running Asset Collection
Once everything is deployed, daily collection is simple:
# Navigate to folder
cd C:\Scripts\winrm-https
# Run collection (will prompt for credentials)
.\Invoke-RemoteAssetCollection-HTTPS.ps1 `
-HostnameListFile ".\shopfloor-hostnames.txt" `
-Domain "logon.ds.ge.com"
Or use stored credentials:
# Store credentials (one time)
$cred = Get-Credential
$cred | Export-Clixml -Path "C:\Secure\shopfloor-cred.xml"
# Use in collection script
$cred = Import-Clixml -Path "C:\Secure\shopfloor-cred.xml"
.\Invoke-RemoteAssetCollection-HTTPS.ps1 `
-HostnameListFile ".\shopfloor-hostnames.txt" `
-Domain "logon.ds.ge.com" `
-Credential $cred
Automated scheduled task:
# Create scheduled task to run daily
$action = New-ScheduledTaskAction -Execute "PowerShell.exe" `
-Argument "-ExecutionPolicy Bypass -File C:\Scripts\winrm-https\Invoke-RemoteAssetCollection-HTTPS.ps1 -HostnameListFile C:\Scripts\winrm-https\shopfloor-hostnames.txt -Domain logon.ds.ge.com"
$trigger = New-ScheduledTaskTrigger -Daily -At 2AM
Register-ScheduledTask -TaskName "Shopfloor Asset Collection" `
-Action $action -Trigger $trigger -User "DOMAIN\ServiceAccount" `
-RunLevel Highest
Troubleshooting
Problem: DNS Resolution Fails
Resolving hostname.logon.ds.ge.com... [DNS FAILED]
Solution:
# Check DNS
Resolve-DnsName "hostname.logon.ds.ge.com"
# If fails, verify DNS server has records for *.logon.ds.ge.com
# Or add to hosts file temporarily:
Add-Content C:\Windows\System32\drivers\etc\hosts "10.134.48.12 G1JJVH63ESF.logon.ds.ge.com"
Problem: Connection Refused
Testing hostname.logon.ds.ge.com... [FAIL]
Solution:
# Check if port 5986 is open
Test-NetConnection -ComputerName "hostname.logon.ds.ge.com" -Port 5986
# If fails:
# 1. Check Windows Firewall on target PC
# 2. Verify WinRM HTTPS listener exists
# 3. Confirm certificate is installed
On target PC:
# Check firewall
Get-NetFirewallRule -DisplayName "WinRM HTTPS-In"
# Check listener
winrm enumerate winrm/config/listener
# Check certificate
Get-ChildItem Cert:\LocalMachine\My | Where-Object {$_.Subject -like "*logon.ds.ge.com*"}
Problem: Certificate Error
The SSL certificate is signed by an unknown authority
Solution for Self-Signed Certificates:
Option 1: Install Root Certificate on Management Server
# Export the certificate as CER (public key only)
$cert = Get-ChildItem Cert:\LocalMachine\My | Where-Object {$_.Subject -like "*logon.ds.ge.com*"}
Export-Certificate -Cert $cert -FilePath ".\wildcard-root.cer"
# Import to Trusted Root on management server
Import-Certificate -FilePath ".\wildcard-root.cer" -CertStoreLocation Cert:\LocalMachine\Root
Option 2: Skip Certificate Check (Testing Only)
.\Invoke-RemoteAssetCollection-HTTPS.ps1 `
-HostnameListFile ".\shopfloor-hostnames.txt" `
-Domain "logon.ds.ge.com" `
-SkipCertificateCheck
Problem: Access Denied
[FAIL] hostname.logon.ds.ge.com - Access is denied
Solution:
# Verify credentials have admin rights on target PC
# Test with manual connection:
$cred = Get-Credential
Enter-PSSession -ComputerName "hostname.logon.ds.ge.com" -Credential $cred -UseSSL
# If successful, credentials are correct
# If fails, check:
# 1. User is member of local Administrators group
# 2. UAC is not blocking remote admin
# 3. Correct domain/username format (DOMAIN\username)
Problem: Script Not Found
[SCRIPT NOT FOUND]
Script not found on hostname at C:\Scripts\Update-PC-CompleteAsset.ps1
Solution:
# The asset collection script must exist on target PCs
# Deploy Update-PC-CompleteAsset.ps1 to each PC first
# Or specify different path:
.\Invoke-RemoteAssetCollection-HTTPS.ps1 `
-HostnameListFile ".\shopfloor-hostnames.txt" `
-Domain "logon.ds.ge.com" `
-ScriptPath "D:\Scripts\Update-PC-CompleteAsset.ps1"
Problem: Certificate Expired
# Check certificate expiration
$cert = Get-ChildItem Cert:\LocalMachine\My | Where-Object {$_.Subject -like "*logon.ds.ge.com*"}
$cert.NotAfter
# If expired, generate new certificate and redeploy
.\Generate-WildcardCert.ps1 -ValidityYears 2
Getting More Help
-
Check logs:
Get-Content .\logs\remote-collection-https.log -Tail 50 -
Read detailed documentation:
WINRM_HTTPS_DEPLOYMENT_GUIDE.md -
Get script help:
Get-Help .\Setup-WinRM-HTTPS.ps1 -Full Get-Help .\Invoke-RemoteAssetCollection-HTTPS.ps1 -Full -
Test individual components:
# Test DNS Resolve-DnsName "hostname.logon.ds.ge.com" # Test port Test-NetConnection -ComputerName "hostname.logon.ds.ge.com" -Port 5986 # Test WinRM Test-WSMan -ComputerName "hostname.logon.ds.ge.com" -UseSSL -Port 5986
Quick Reference
Important Files
| File | Purpose |
|---|---|
Generate-WildcardCert.ps1 |
Create certificate |
Setup-WinRM-HTTPS.ps1 |
Setup WinRM on PC |
Test-WinRM-HTTPS-Setup.ps1 |
Test setup |
Invoke-RemoteAssetCollection-HTTPS.ps1 |
Run collection |
shopfloor-hostnames.txt |
PC list (175 PCs) |
Important Commands
# Generate certificate
.\Generate-WildcardCert.ps1
# Test single PC
.\Test-WinRM-HTTPS-Setup.ps1
# Test connections
.\Invoke-RemoteAssetCollection-HTTPS.ps1 -HostnameListFile ".\shopfloor-hostnames.txt" -Domain "logon.ds.ge.com" -TestConnections
# Run collection
.\Invoke-RemoteAssetCollection-HTTPS.ps1 -HostnameListFile ".\shopfloor-hostnames.txt" -Domain "logon.ds.ge.com"
# Check logs
Get-Content .\logs\remote-collection-https.log -Tail 50
Default Values
- HTTPS Port: 5986
- Domain: logon.ds.ge.com
- Certificate Validity: 2 years
- Max Concurrent Sessions: 5
- Log Location:
.\logs\remote-collection-https.log
Summary
Follow these phases:
- Phase 1: Test on single device (your computer)
- Phase 2: Test on 3-5 shopfloor PCs
- Phase 3: Deploy to all 175 PCs in batches
- Daily Ops: Run automated collection
Total Time:
- Phase 1: 15-30 minutes
- Phase 2: 1-2 hours
- Phase 3: 4-8 hours (depending on method)
Good luck with your deployment!