If the Snow Software Update Service (SUS) cannot connect, updates may fail. Network or security settings such as blocked ports, DNS issues, or CDN routing problems are often the cause. This PowerShell script helps you quickly test connectivity to SUS endpoints so you can identify where the problem lies.
What the script does
For each SUS endpoint, the script runs a series of checks to confirm that your system can reach Snow update services:
- DNS Resolution: Uses Resolve-DnsName to fetch A and CNAME records.
- CDN Detection: Matches known CDN patterns (Azure CDN, CloudFront, Akamai, etc.) via regex.
- TCP Connectivity: Tests port 443 using Test-NetConnection.
- ICMP Ping: Uses Test-Connection for basic reachability (skipped for known failures like azureedge.net).
- MTU Discovery: Binary search to find the largest non-fragmented packet size.
- CURL Check: Executes curl.exe to validate HTTPS response and status codes.
- Pathping Analysis: Runs pathping in a background job to detect packet loss and unreachable hops.
- Logging: All output is time-tamped and saved via Start-Transcript.
Diagnostic workflow
For each endpoint:
- DNS & CDN: Resolves DNS and identifies CDN provider.
- ICMP & TCP: Verifies basic and secure connectivity.
- MTU Test: Determines optimal packet size.
- CURL Test: Checks HTTP response status.
- Pathping: Assesses network path reliability.
- Summary: Logs results and aggregates success/failure counts.
Run the script in PowerShell 5.1 (Windows) or PowerShell 7.x (cross-platform) or later. Open PowerShell as an administrator for full access to system resources.
# ============================
# SUS Connectivity Diagnostic Script
# ============================
# Version: 3.6
# Date: 20250806
function Write-Log {
param (
[string]$Message,
[string]$Color = "White"
)
$timestamp = (Get-Date).ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ")
$logMessage = "[$timestamp] $Message"
Write-Host $logMessage -ForegroundColor $Color
}
function Get-CDNProvider {
param ($cname)
if ($cname -match "azureedge\.net|azurefd\.net") { return "Azure CDN" }
elseif ($cname -match "msecnd\.net") { return "Azure CDN (legacy)" }
elseif ($cname -match "cloudfront\.net") { return "Amazon CloudFront" }
elseif ($cname -match "akamai|akamaiedge\.net|edgekey\.net|akadns\.net") { return "Akamai" }
elseif ($cname -match "edgesuite\.net") { return "Akamai (legacy)" }
elseif ($cname -match "fastly\.net|fastlylb\.net") { return "Fastly" }
elseif ($cname -match "cdn77\.org") { return "CDN77" }
elseif ($cname -match "stackpathcdn\.com|stackpathdns\.com") { return "StackPath" }
elseif ($cname -match "edgecastcdn\.net|systemcdn\.net") { return "Edgecast (Verizon)" }
elseif ($cname -match "llnwd\.net|limelight\.com|edgio\.net") { return "Limelight Networks (Edgio)" }
elseif ($cname -match "hwcdn\.net") { return "Highwinds CDN" }
elseif ($cname -match "voxcdn\.net") { return "VoxCDN" }
elseif ($cname -match "cachefly\.net") { return "CacheFly" }
elseif ($cname -match "google\.com|googleusercontent\.com|gstatic\.com") { return "Google Cloud CDN" }
elseif ($cname -match "cdn.cloudflare\.net|cloudflare\.net") { return "Cloudflare" }
elseif ($cname -match "netdna-cdn\.com|maxcdn\.com") { return "MaxCDN" }
elseif ($cname -match "incapdns\.net") { return "Imperva Incapsula" }
elseif ($cname -match "sucuri\.net") { return "Sucuri" }
elseif ($cname -match "cloudinary\.com") { return "Cloudinary" }
elseif ($cname -match "imgix\.net") { return "Imgix" }
elseif ($cname -match "blazingcdn\.com") { return "BlazingCDN" }
elseif ($cname -match "arvancloud\.com") { return "ArvanCloud" }
elseif ($cname -match "belugacdn\.com") { return "BelugaCDN" }
elseif ($cname -match "cdnify\.com") { return "CDNify" }
elseif ($cname -match "cdnsun\.net") { return "CDNsun" }
elseif ($cname -match "cdnlion\.com") { return "CDNlion" }
elseif ($cname -match "b-cdn\.net") { return "Bunny CDN" }
elseif ($cname -match "wpmudev\.host") { return "WPMU DEV CDN" }
elseif ($cname -match "clever-cloud\.com") { return "Clever Cloud" }
elseif ($cname -match "netlify\.app") { return "Netlify Edge CDN" }
elseif ($cname -match "firebaseapp\.com") { return "Firebase Hosting CDN" }
elseif ($cname) { return "Unknown or custom CDN" }
else { return "None" }
}
function Test-MTU {
param($TargetHost)
Write-Log "`n[MTU] Testing maximum packet size to $TargetHost ..." "Cyan"
$low = 1200
$high = 1472
$best = $low
while ($low -le $high) {
$mid = [math]::Floor(($low + $high) / 2)
$ping = ping.exe -n 1 -f -l $mid $TargetHost
if ($ping -match "Reply from") {
$best = $mid
$low = $mid + 1
} elseif ($ping -match "Packet needs to be fragmented") {
$high = $mid - 1
} else {
break
}
}
if ($best -gt 0) {
Write-Log " -> Largest non-fragmented packet: $best bytes." "Green"
} else {
Write-Log " -> Unable to determine MTU." "Red"
}
}
function Test-Curl {
param($TargetHost)
Write-Log "`n[CURL] Connectivity check for https://$TargetHost ..." "Cyan"
try {
$outFile = [System.IO.Path]::GetTempFileName()
$errFile = [System.IO.Path]::GetTempFileName()
Start-Process -FilePath "curl.exe" `
-ArgumentList "-I --connect-timeout 5 --max-time 10 https://$TargetHost" `
-NoNewWindow -RedirectStandardOutput $outFile -RedirectStandardError $errFile -Wait
$output = Get-Content -Path $outFile -Raw
$errorOut = Get-Content -Path $errFile -Raw
$fullOutput = $output + "`n" + $errorOut
Remove-Item -Path $outFile, $errFile -ErrorAction SilentlyContinue
if ($fullOutput -match "HTTP/[\d\.]+\s+(\d{3})") {
$statusCode = $Matches[1]
Write-Log " - HTTP response status: $statusCode" "Green"
if ($statusCode -match "^2\d\d|^3\d\d|^4\d\d|^5\d\d") {
Write-Log " - Endpoint is reachable (status code: $statusCode)." "Green"
return "Pass"
} else {
Write-Log " - Unexpected status code: $statusCode." "Yellow"
return "Fail"
}
} else {
Write-Log " - No HTTP response detected." "Red"
return "Fail"
}
} catch {
Write-Log " - CURL test failed: $($_.Exception.Message)" "Red"
return "Fail"
}
}
function Run-Pathping {
param($TargetHost)
Write-Log "`n[Pathping] Running pathping for $TargetHost (this may take ~30 seconds)..." "Cyan"
try {
$job = Start-Job -ScriptBlock { param($ep) cmd.exe /c "pathping -n $ep" } -ArgumentList $TargetHost
[int]$elapsedSeconds = 0
while (-not (Wait-Job $job -Timeout 1)) {
$elapsedSeconds++
Write-Log "Elapsed: ${elapsedSeconds}s" "DarkGray"
Start-Sleep -Seconds 1
}
$pathpingOutput = Receive-Job $job
Write-Log "Pathping completed in ${elapsedSeconds}s" "Cyan"
if ($pathpingOutput) {
foreach ($line in $pathpingOutput) {
Write-Log " $line" "Gray"
}
} else {
Write-Log "No pathping data returned." "DarkYellow"
}
Remove-Job $job -Force
} catch {
Write-Log "Error running pathping: $_" "Red"
}
}
$endpoints = @(
"updates.snowsoftware.com",
"updatesportal.snowsoftware.com",
"scs.snowsoftware.com",
"sus.snowsoftware.com",
"sus-as-foundation.azurewebsites.net",
"snowsoftwareupdates.azureedge.net"
) | Sort-Object -Unique
$Timestamp = (Get-Date).ToUniversalTime().ToString("yyyyMMddTHHmmssZ")
$TranscriptFile = Join-Path -Path (Get-Location) -ChildPath "ConnectivityTranscript_$Timestamp.txt"
Start-Transcript -Path $TranscriptFile -Append
$GlobalErrorCount = 0
$Stopwatch = [System.Diagnostics.Stopwatch]::StartNew()
$Results = @()
[int]$ICMP_Pass = 0
[int]$ICMP_Fail = 0
foreach ($url in $endpoints) {
Write-Log "`n=====================================================" "DarkCyan"
Write-Log " Testing connectivity to $url" "Magenta"
Write-Log "=====================================================" "DarkCyan"
try {
$dnsRecords = Resolve-DnsName -Name $url -Type A,CNAME -ErrorAction Stop
$cname = ($dnsRecords | Where-Object { $_.Type -eq "CNAME" }).NameHost
$ips = ($dnsRecords | Where-Object { $_.Type -eq "A" }).IPAddress
if ($cname) {
$cdn = Get-CDNProvider -cname $cname
Write-Log "CNAME: $cname" "Green"
Write-Log "CDN Provider (detected): $cdn" "Green"
} else {
Write-Log "No CNAME record." "Yellow"
}
if ($ips) {
Write-Log "Resolved IP(s): $($ips -join ', ')" "DarkGreen"
}
} catch {
Write-Log "DNS resolution failed: $_" "Red"
}
if ($url -eq "snowsoftwareupdates.azureedge.net") {
Write-Log "Skipping ICMP test for $url (expected failure)." "Yellow"
} else {
try {
$icmpResult = Test-Connection -ComputerName $url -Count 4 -Quiet -ErrorAction Stop
if ($icmpResult) {
Write-Log "ICMP reachable (ping succeeded)." "Green"
$ICMP_Pass++
} else {
Write-Log "ICMP unreachable (ping failed)." "Yellow"
$ICMP_Fail++
}
} catch {
Write-Log "ICMP test failed: $_" "Red"
$ICMP_Fail++
}
}
$tcpResult = Test-NetConnection -ComputerName $url -Port 443
if ($tcpResult.TcpTestSucceeded) {
Write-Log "TCP 443 reachable." "Green"
} else {
Write-Log "TCP 443 NOT reachable." "Red"
$GlobalErrorCount++
}
Test-MTU -TargetHost $url
$curl = Test-Curl -TargetHost $url
if ($curl -eq "Fail") { $GlobalErrorCount++ }
Run-Pathping -TargetHost $url
$Results += [PSCustomObject]@{
Target = $url
TCP443 = $tcpResult.TcpTestSucceeded
CURL = $curl
}
Write-Log "=====================================================" "DarkCyan"
}
Write-Log "`n========= SUMMARY ==========" "Cyan"
$Results | Format-Table -AutoSize
Write-Log "=============================" "Cyan"
Write-Log "Total Errors Detected: $GlobalErrorCount" "Yellow"
Write-Log "ICMP Summary:" "Cyan"
Write-Log " - Successful ICMP pings: $ICMP_Pass" "Green"
Write-Log " - Failed ICMP pings: $ICMP_Fail" "Red"
$Stopwatch.Stop()
Write-Log "Total Time Elapsed: $([math]::Round($Stopwatch.Elapsed.TotalSeconds,2)) seconds" "Cyan"
Write-Log "`nDiagnostics completed." "Green"
Stop-TranscriptOutput
- Results display in the PowerShell console.
- A transcript file named
ConnectivityTranscript_<timestamp>.txtis saved in the working directory. - The summary shows total errors, ICMP success/failure counts, and overall connectivity status.
Next steps
- Review the transcript file for failed checks.
- Share results with your network or security team if issues are found.
- Provide the transcript to technical support if additional troubleshooting is required.
Related Articles
How To: Perform an Offline Update using Snow Update Service (SUS) 230Number of Views Snow Update Service fails to start with error 1053 (SUS fails to load or has stopped) 408Number of Views Trust and install Snow Software Update Service (SUS) certificate 5Number of Views Support: Snow Update Service (SUS) - has exceeded the allotted timeout 12Number of Views URLs used for the Snow Update Service 342Number of Views
Hi, I am Reva - Ask me anything.
No new updates
Thanks for the feedback!
Your feedback has been saved.Rate this response:
Add Additional feedback ( Optional )
Are you sure you want to cancel
the case creation?
Are you sure you want to cancel the case creation?
Are you sure you want to close this case
| Products | Region | Phone Numbers |
|---|---|---|
| FlexNet Operations FlexNet Embedded FlexNet Publisher FlexNet Connect FlexNet Code Insight InstallAnywhere InstallShield |
North America * |
+1 630-332-2513 (toll) +1 877-279-2853 (toll-free in North America) |
| Europe * |
+44 1925 944367 (toll) +44 800 047 8642 (toll-free in Europe) |
|
| Japan * | +81 3-4540-5335 (select option 2) | |
| Australia * |
+61 3 9895 2177 +61 1800 560 603 (toll-free in Australia) |
|
|
Usage Intelligence (formerly
Revulytics) Compliance Intelligence |
Please use the Case Portal to submit your support ticket or reach out to your Revenera contact. | |
Case id: 00001065
Activity: Status change: 2 hours ago