Jump to content

Pulseway agents not working anymore after Windows NET.Framework Patch


Recommended Posts

Posted

Hello all,

We have agents running over multiple rds environments.

Pulseway has patched Net.Framework

After this patch Pulseway dashboard is showing those systems as offline but they are up.

What ive tried:

  • Executing the PCMonitor.exe is not showing or doing anything
  • Reboot rds servers
  • Restarting service PCMonitorsrv.exe in services, is giving me this error: 'Windows could not start the Pulseway service on Local Computer / Error 1053: The service did not respond to the start or control request in a timely fashion.

Weird thing is, Pulseway dashboard is working on those systems, but the agent is not working.

Please help me out!

Regards,


Leroy

Posted

Hi Paul, & Mariale 

Thanks for the fast reply,

See attachment for the windows log: 

Screenshot2024-11-15at10_30_59.thumb.png.774ac5265cddfbf81fedaba3012410fd.png

After this i checked if the service was running, service wasnt running, when enabling the pulseway agent service i get this error:

 

Screenshot2024-11-15at10_34_44.png.9e27e9bdfc281712f5dc9d37ac0b83d0.png

Regards,

-Leroy 

 

Posted

The Pulseway service on workstations will not start and appears to be marked for deletion.  I was also unable to reinstall Pulseway agent and unable to uninstall the current Pulseway agent.  Any way to manually fix this?

  • Administrators
Posted

@KerryC for the crashes, did you see any "Application Error" error too? Can you please send us a screenshot of that event too?

If the service is marked for deletion it should be removed upon a reboot. Once it's removed, you can use installutil from the C:\Windows\Microsoft.NET\Framework64\v4.0.30319 folder to manually register the service:

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\installutil.exe "c:\program files\pulseway\pcmonitorsrv.exe"

-Paul

Posted

Hey @Paul I have been experiencing this bug too in the last week I lost access to multiple windows 11 systems. Is there any suggested fix for this issue yet as even reinstalling doesn't work to fix this issue. I have attached the event logs too.

 

Screenshot 2024-11-22 at 8.31.49 am.png

Screenshot 2024-11-22 at 8.32.33 am.png

Screenshot 2024-11-22 at 8.33.02 am.png

  • 2 weeks later...
  • Administrators
Posted

Update, we've identified the issue and we've built a correction script that must be executed as an administrator on affected machines:

# Function to calculate file hash
function Get-FileHashLower {
    param (
        [string]$FilePath,
        [string]$Algorithm = "MD5"
    )

    if (-not (Test-Path -Path $FilePath)) {
        Write-Output "Error: File not found - $FilePath"
        return $null
    }

    try {
        return (Get-FileHash -Path $FilePath -Algorithm $Algorithm).Hash.ToLower()
    } catch {
        Write-Output "Error: Unable to calculate hash for $FilePath. $_"
        return $null
    }
}


Write-Output "Environment Variables:"
Get-ChildItem Env: | Sort-Object Name

# Enable TLS 1.2
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

# Step 0: Locate "PC Monitor" service binary folder
$ServiceName = "PC Monitor"
$Service = Get-Service -Name $ServiceName -ErrorAction SilentlyContinue

if (-not $Service) {
    Write-Output "Error: '$ServiceName' service not found."
    exit 1
}

$BinaryPath = (Get-WmiObject Win32_Service | Where-Object { $_.Name -eq $ServiceName }).PathName.Trim('"')
if (-not $BinaryPath) {
    Write-Output "Error: Unable to find binary path for '$ServiceName'."
    exit 1
}

$BinaryFolder = Split-Path -Path $BinaryPath -Parent
Write-Output "Binary folder located: $BinaryFolder"

# Step 1: Download and verify update.zip
$UpdateUrl = "https://updates.pulseway.com/update.zip"
$DownloadedFile = "$env:Temp\update.zip"

try {
    $WebClient = New-Object System.Net.WebClient
    $WebClient.DownloadFile($UpdateUrl, $DownloadedFile)
    Write-Output "File downloaded successfully to $DownloadedFile"
} catch {
    Write-Output "Error: Failed to download the update file. $_"
    exit 1
}

$ExpectedMD5 = "9235318c553c3f770ba95ab673566a4e"
$DownloadedMD5 = Get-FileHashLower -FilePath $DownloadedFile

if ($DownloadedMD5 -ne $ExpectedMD5) {
    Write-Output "Error: MD5 hash of the downloaded file does not match. Expected: $ExpectedMD5, Found: $DownloadedMD5"
    exit 1
}

# Step 2: Extract the archive
$ExtractedFolder = "$env:Temp\update_extracted"
Write-Output "Extracted Path: $TargetPath"
if (Test-Path $ExtractedFolder) { Remove-Item -Recurse -Force $ExtractedFolder }
New-Item -ItemType Directory -Path $ExtractedFolder | Out-Null
Add-Type -AssemblyName System.IO.Compression.FileSystem
[System.IO.Compression.ZipFile]::ExtractToDirectory($DownloadedFile, $ExtractedFolder)
Write-Output "Extracted Files: ----"
Get-ChildItem -Path $ExtractedFolder -Recurse | ForEach-Object { Write-Output $_.FullName }
Write-Output "Extracted Files: ++++"

# Step 3: Compare hashes of files
$DiscrepantFiles = @()
foreach ($File in Get-ChildItem -Recurse -Path $ExtractedFolder) {
    # Normalize and resolve paths
    $ResolvedExtractedFolder = (Get-Item $ExtractedFolder).FullName
    $ResolvedFilePath = (Get-Item $File.FullName).FullName

    # Calculate relative path
    $RelativePath = $ResolvedFilePath.Substring($ResolvedExtractedFolder.Length).TrimStart('\')

    Write-Output "Resolved Extracted Folder: $ResolvedExtractedFolder"
    Write-Output "Resolved File Path: $ResolvedFilePath"
    Write-Output "Calculated Relative Path: $RelativePath"

    # Calculate target path
    $TargetPath = Join-Path -Path $BinaryFolder -ChildPath $RelativePath
    Write-Output "Calculated Target Path: $TargetPath"

    if ($File.PSIsContainer) {
        # Create folder if it does not exist
        if (-not (Test-Path $TargetPath)) {
            Write-Output "Creating folder in target path: $RelativePath"
            New-Item -ItemType Directory -Path $TargetPath -Force | Out-Null
        }
    } else {
        # Compare files
        if (-not (Test-Path $TargetPath)) {
            Write-Output "File not found in target folder: $RelativePath"
            $DiscrepantFiles += $RelativePath
        } else {
            $SourceHash = Get-FileHashLower -FilePath $File.FullName
            $TargetHash = Get-FileHashLower -FilePath $TargetPath

            if ($SourceHash -eq $null -or $TargetHash -eq $null) {
                Write-Output "Skipping comparison due to hash error: $RelativePath"
                continue
            }

            if ($SourceHash -ne $TargetHash) {
                Write-Output "Hash mismatch for file: $RelativePath"
                $DiscrepantFiles += $RelativePath
            }
        }
    }
}

# Step 3.5: Exit if no discrepancies found
if ($DiscrepantFiles.Count -eq 0) {
    Write-Output "No discrepancies found. Exiting."
    exit 0
}

# Step 4: Print the list of discrepant files
Write-Output "Discrepant files:"
$DiscrepantFiles | ForEach-Object { Write-Output $_ }

# Step 5: Stop "PC Monitor" service and related processes
$ProcessesToKill = @("pcmonitormanager.exe", "pcmonitorsrv.exe", "pcmontask.exe", "pcmonusertask.exe", "cli.exe", "addonmanager.exe", "pcmupdate.exe")

for ($i = 1; $i -le 5; $i++) {
    if ($Service.Status -eq "Running") {
        Stop-Service -Name $ServiceName -Force -ErrorAction SilentlyContinue
    }

    foreach ($ProcessName in $ProcessesToKill) {
        Get-Process -Name $ProcessName -ErrorAction SilentlyContinue | Stop-Process -Force
    }

    Start-Sleep -Seconds 1
    if ((Get-Service -Name $ServiceName).Status -eq "Stopped" -and -not (Get-Process -Name $ProcessesToKill -ErrorAction SilentlyContinue)) {
        break
    }

    Write-Output "Retrying stop operation... ($i/5)"
    if ($i -eq 5) {
        Write-Output "Error: Failed to stop all processes after 5 attempts."
        exit 1
    }
}

# Step 6: Copy discrepant files
foreach ($File in $DiscrepantFiles) {
    $SourceFile = Join-Path $ExtractedFolder $File
    $TargetFile = Join-Path $BinaryFolder $File
    $TargetFolder = Split-Path -Path $TargetFile -Parent

    if (-not (Test-Path $TargetFolder)) {
        New-Item -ItemType Directory -Path $TargetFolder | Out-Null
    }

    for ($i = 1; $i -le 5; $i++) {
        Copy-Item -Path $SourceFile -Destination $TargetFile -Force -ErrorAction SilentlyContinue
        if (Test-Path $TargetFile) { break }
        Write-Output "Retrying copy operation for $File... ($i/5)"
        Start-Sleep -Seconds 1
    }

    if (-not (Test-Path $TargetFile)) {
        Write-Output "Error: Failed to copy $File after 5 attempts."
        exit 1
    }
}

# Step 7: Verify hashes again
$PostVerificationFailures = @()
foreach ($File in $DiscrepantFiles) {
    $SourceFile = Join-Path $ExtractedFolder $File
    $TargetFile = Join-Path $BinaryFolder $File

    $SourceHash = Get-FileHashLower -FilePath $SourceFile
    $TargetHash = Get-FileHashLower -FilePath $TargetFile

    if ($SourceHash -ne $TargetHash) {
        $PostVerificationFailures += $File
    }
}

if ($PostVerificationFailures.Count -gt 0) {
    Write-Output "Post-repair verification failed for the following files:"
    $PostVerificationFailures | ForEach-Object { Write-Output $_ }
    exit 1
}

# Step 8: Start the "PC Monitor" service
Start-Service -Name $ServiceName
Write-Output "Agent repair successful."
exit 0

We apologize for the inconvenience caused.

-Paul

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...