Purpose
Use this guide when Zscaler Client Connector shows a firewall block error, a server error, or a loss of ZIA or ZPA access. Validate posture, services, tunnel state, and authentication before escalating.
Device posture requirement: the organization’s minimum CrowdStrike ZTA overall score (example used here: 90). A running Zscaler service does not guarantee access if the posture check fails.
Symptoms
- Firewall block error
- Server error
- Tunnel unavailable
1. Verify Falcon Sensor and ZTA Score
Run PowerShell as Administrator. First, confirm the ZTA token exists:
Get-Content "C:\ProgramData\CrowdStrike\ZeroTrustAssessment\data.zta"
The token contains three dot-separated sections. Decode the second section (the payload) to read the assessment values:
$token = (Get-Content 'C:\ProgramData\CrowdStrike\ZeroTrustAssessment\data.zta' -Raw).Trim()
$payload = $token.Split('.')[1].Replace('-', '+').Replace('_', '/')
$payload += '=' * ((4 - $payload.Length % 4) % 4)
$zta = [Text.Encoding]::UTF8.GetString([Convert]::FromBase64String($payload)) | ConvertFrom-Json
$zta.assessment | Format-List overall, os, sensor_config, version
Pass: the overall score meets the organization’s minimum ZTA score (example used here: 90).
Fail: the score is below that minimum (example used here: 90), the token is missing, or the payload cannot be decoded. Investigate Falcon sensor and ZTA health before changing Zscaler policy.
2. Quick Zscaler Health Check
Check the required Windows services:
Get-Service ZSAService, ZSATunnel | Format-Table Name, Status, StartType
Check ZIA, ZPA, and overall Client Connector status:
& "C:\Program Files\Zscaler\ZSACli\ZSACli.exe" status -s zia
& "C:\Program Files\Zscaler\ZSACli\ZSACli.exe" status -s zpa
& "C:\Program Files\Zscaler\ZSACli\ZSACli.exe" status -s all
Healthy indicators include TUNNEL_FORWARDING and AUTHENTICATED.
If the CLI says login or CLI usage is required, the applicable ZCC policy must permit CLI usage and the user must be signed in.
3. Restart ZIA or ZPA
Use only when the service is present but the related tunnel is unhealthy.
Restart ZIA:
& "C:\Program Files\Zscaler\ZSACli\ZSACli.exe" disable -s zia
Start-Sleep -Seconds 15
& "C:\Program Files\Zscaler\ZSACli\ZSACli.exe" enable -s zia
Restart ZPA:
& "C:\Program Files\Zscaler\ZSACli\ZSACli.exe" disable -s zpa
Start-Sleep -Seconds 15
& "C:\Program Files\Zscaler\ZSACli\ZSACli.exe" enable -s zpa
Verify:
& "C:\Program Files\Zscaler\ZSACli\ZSACli.exe" status -s zia
& "C:\Program Files\Zscaler\ZSACli\ZSACli.exe" status -s zpa
4. RMM automation script (e.g., NinjaOne)
The note describes the script this way. It verifies the status of Zscaler by checking whether it is installed, whether the required services are running, whether the necessary registry entries exist and have the correct values, and by making HTTP requests to verify Zscaler authentication.
The note says Test-ZscalerStatus performs these checks:
- Zscaler is installed, by querying the registry.
- The required Zscaler services are installed and running.
- The necessary registry entries exist and have the correct values.
- HTTP requests to ip.zscaler.com verify Zscaler authentication.
ZscalerStatus.ps1
# Variables
$regPath = "HKCU:\Software\Zscaler\App"
# Lists/Arrays
$requiredServices = @("ZSAService", "ZSATunnel")
$optionalServices = @("ZSATrayManager", "ZSAUpm")
# Function to check if Zscaler is installed
function Test-ZscalerInstalled {
$zscalerFiles = @(
"C:\Program Files\Zscaler\ZSAService\ZSAService.exe",
"C:\Program Files\Zscaler\ZSATunnel\ZSATunnel.exe",
"C:\Program Files\Zscaler\ZSATrayManager\ZSATrayManager.exe",
"C:\Program Files\Zscaler\ZSAUpm\ZSAUpm.exe"
)
foreach ($file in $zscalerFiles) {
Write-Verbose "Checking Zscaler installation path: $file"
if (Test-Path $file) {
Write-Verbose "Zscaler installation found."
return $true
}
}
Write-Warning "Zscaler installation not found."
return $false
}
# Function to check if a service exists
function Test-ServiceExists {
param (
[string]$serviceName
)
$service = Get-Service -Name $serviceName -ErrorAction SilentlyContinue
if ($service) {
Write-Verbose "Service exists: $serviceName"
return $true
}
Write-Warning "Service does not exist: $serviceName"
return $false
}
# Function to get service status
function Get-ServiceStatus {
param (
[string]$serviceName
)
try {
$service = Get-Service -Name $serviceName -ErrorAction Stop
if ($service.Status -eq 'Running') {
Write-Verbose "$serviceName is Running"
return $true
}
Write-Warning "$serviceName is $($service.Status)"
return $false
}
catch {
Write-Warning "$serviceName not found"
return $false
}
}
# Function to retrieve registry values
function Get-RegistryValue {
param (
[string]$path,
[string]$name
)
try {
return (Get-ItemProperty -Path $path -Name $name -ErrorAction Stop).$name.Trim()
}
catch {
Write-Warning "$name not found in $path"
return "Not Found"
}
}
# Function to verify Zscaler authentication
function Test-ZscalerAuthentication {
$url = "https://ip.zscaler.com/"
$attempts = 3
for ($i = 1; $i -le $attempts; $i++) {
try {
$response = Invoke-WebRequest `
-Uri $url `
-UseBasicParsing `
-TimeoutSec 30
if (
$response.StatusCode -eq 200 -and
(
$response.Content -match "Zscaler" -or
$response.Content -match "Your request is arriving"
)
) {
return $true
}
}
catch {
Write-Warning "Authentication test attempt $i failed."
}
Start-Sleep -Seconds 3
}
return $false
}
# Main Function
function Test-ZscalerStatus {
$zscalerInstalled = Test-ZscalerInstalled
if (-not $zscalerInstalled) {
Write-Warning "Zscaler installation not detected."
return $false
}
$allServicesRunning = $true
foreach ($serviceName in $requiredServices) {
$status = Get-ServiceStatus -serviceName $serviceName
if (-not $status) {
$allServicesRunning = $false
}
}
$znwState = Get-RegistryValue -path $regPath -name "ZNW_State"
$zpaState = Get-RegistryValue -path $regPath -name "ZPA_State"
$zwsState = Get-RegistryValue -path $regPath -name "ZWS_State"
$zpaAuthState = Get-RegistryValue -path $regPath -name "ZPAAuth_State"
$zpaStateValid = $zpaState -eq "TUNNEL_FORWARDING"
$zwsStateValid = $zwsState -eq "TUNNEL_FORWARDING"
$zpaAuthValid = $zpaAuthState -eq "AUTHENTICATED"
Write-Host ""
Write-Host "===== ZSCALER STATUS ====="
Write-Host "Installed : $zscalerInstalled"
Write-Host "ZNW State : $znwState"
Write-Host "ZPA State : $zpaState"
Write-Host "ZWS State : $zwsState"
Write-Host "ZPA Auth State : $zpaAuthState"
Write-Host "Services OK : $allServicesRunning"
Write-Host "=========================="
Write-Host ""
$isZscalerOperational = (
$zscalerInstalled -and
$allServicesRunning -and
$zpaAuthValid -and
$zpaStateValid -and
$zwsStateValid
)
return $isZscalerOperational
}
# Run Test
Test-ZscalerStatus
5. Check Falcon Firewall Blocks
Because the Windows firewall is managed through CrowdStrike Falcon Firewall Management, check Falcon before concluding that the Zscaler error is caused by a local firewall block.
- Open the CrowdStrike Falcon console and go to the Firewall Management activity or firewall events view.
- Search for the affected hostname and the time when the Zscaler firewall or server error occurred.
- Filter for blocked traffic. Review events involving Zscaler processes such as ZSAService.exe, ZSATunnel.exe, ZSATrayManager.exe, ZSAUpm.exe, ZSAHelper.exe, or ZSACli.exe.
- Record the process name, action, direction, protocol, local and remote IP addresses, ports, event time, and the Falcon rule or policy that matched.
- Confirm whether the traffic was actually blocked. Do not change the Falcon policy based only on the Zscaler GUI message. If a block is confirmed, update the applicable Falcon rule through the normal change process and retest.
6. Workarounds and Recovery
Use these as temporary recovery or validation steps. Record what resolves the issue, because the result helps identify whether the failure is related to the session, tunnel, posture, firewall, or Client Connector build.
- Sign out and sign back in to Zscaler Client Connector. Retrieve the authorized Client Connector logout password from the Client Connector Admin Portal when prompted. This refreshes the user session and may temporarily clear firewall or server errors.
- Restart only the affected ZIA or ZPA service using the commands in section 3, then verify TUNNEL_FORWARDING and AUTHENTICATED.
- Verify the installed Client Connector version and compare it with the organization-approved version.
- Upgrade Client Connector when required. Newer approved builds may include fixes for defects in older versions. Follow the normal pilot and change-control process.