From fe2e6d624fe9e0af01f0306812176059fb13f8a1 Mon Sep 17 00:00:00 2001 From: PTah Date: Fri, 5 Jun 2026 10:00:11 +1000 Subject: [PATCH] fix: inventory JSON without JavaScriptSerializer WARN (2.0.22-SAC) Use ConvertTo-Json after CIM-safe Convert-AnyToJsonSerializable; pre-sanitize inventory details. Co-authored-by: Cursor --- Login_Monitor.ps1 | 8 ++++++-- Sac-Client.ps1 | 34 ++++++++++++++++++++-------------- version.txt | 2 +- 3 files changed, 27 insertions(+), 17 deletions(-) diff --git a/Login_Monitor.ps1 b/Login_Monitor.ps1 index fa322d4..713d3b1 100644 --- a/Login_Monitor.ps1 +++ b/Login_Monitor.ps1 @@ -89,7 +89,7 @@ $script:SkipLogDetailLimit = 15 # строки ниже, если правки «мелкие» и вы не хотите менять отображаемую версию в логах). # Рекомендация: при значимых релизах меняйте и $ScriptVersion, и version.txt одинаково; при только # исправлениях на шаре — достаточно поднять patch в version.txt (например 1.3.0.1). -$ScriptVersion = "2.0.21-SAC" +$ScriptVersion = "2.0.22-SAC" # Логи (все под InstallRoot) $LogFile = Join-Path $script:InstallRoot "Logs\login_monitor.log" @@ -2212,8 +2212,12 @@ function Send-HostInventoryToSac { $label = Get-MonitorServerLabelWithIp $summary = "Inventory snapshot for $label" $title = "Host inventory: $label" + $details = @{ inventory = $inv } + if (Get-Command Convert-AnyToJsonSerializable -ErrorAction SilentlyContinue) { + $details = Convert-AnyToJsonSerializable @{ inventory = $inv } + } $ok = Send-SacEvent -EventType 'agent.inventory' -Severity 'info' -Title $title -Summary $summary ` - -Details @{ inventory = $inv } + -Details $details if ($ok) { Write-Log "SAC: agent.inventory отправлен (RAM=$($inv.memory_gb) GB, CPU=$($inv.processor.Count), disks=$($inv.disks.Count))." } else { diff --git a/Sac-Client.ps1 b/Sac-Client.ps1 index ea8be21..708d8a3 100644 --- a/Sac-Client.ps1 +++ b/Sac-Client.ps1 @@ -187,14 +187,31 @@ function Convert-AnyToJsonSerializable { if ($Value.GetType().IsPrimitive) { return $Value } - if ($Value -is [datetime] -or $Value -is [datetimeoffset] -or $Value -is [guid]) { + if ($Value -is [enum]) { + return [string]$Value + } + if ($Value -is [decimal] -or $Value -is [single] -or $Value -is [double]) { + return [double]$Value + } + if ($Value -is [datetime] -or $Value -is [datetimeoffset] -or $Value -is [guid] -or $Value -is [version]) { return [string]$Value } if ($Value -is [System.Management.Automation.PSMethod] -or $Value -is [System.Management.Automation.ScriptBlock] -or + $Value -is [System.Management.Automation.PSMemberInfo] -or $Value -is [Delegate]) { return $null } + $typeName = $Value.GetType().FullName + if ($typeName -like 'Microsoft.Management.Infrastructure.CimInstance*' -or + $typeName -like 'Microsoft.Management.Infrastructure.CimProperty*') { + $out = @{} + foreach ($prop in $Value.CimInstanceProperties) { + if ($null -eq $prop -or $null -eq $prop.Name) { continue } + $out[$prop.Name] = Convert-AnyToJsonSerializable $prop.Value + } + return $out + } if ($Value -is [pscustomobject]) { $out = @{} foreach ($prop in $Value.PSObject.Properties) { @@ -225,16 +242,7 @@ function Convert-AnyToJsonSerializable { function ConvertTo-SacJsonText { param([Parameter(Mandatory = $true)]$Payload) $serializable = Convert-AnyToJsonSerializable $Payload - try { - Add-Type -AssemblyName System.Web.Extensions -ErrorAction Stop - $ser = New-Object System.Web.Script.Serialization.JavaScriptSerializer - $ser.MaxJsonLength = 16777216 - $ser.RecursionLimit = 32 - return ,$ser.Serialize($serializable) - } catch { - Write-SacLog "WARN: JavaScriptSerializer unavailable, fallback ConvertTo-Json ($($_.Exception.Message))" - return ,($serializable | ConvertTo-Json -Depth 12 -Compress) - } + return ,($serializable | ConvertTo-Json -Depth 16 -Compress) } function Get-SacCategoryForType { @@ -499,9 +507,7 @@ function Get-SacPostBodyBytes { } try { $text = [System.Text.Encoding]::UTF8.GetString($bytes) - Add-Type -AssemblyName System.Web.Extensions -ErrorAction Stop - $ser = New-Object System.Web.Script.Serialization.JavaScriptSerializer - $null = $ser.DeserializeObject($text) + $null = $text | ConvertFrom-Json -ErrorAction Stop } catch { Write-SacLog "WARN: SAC POST aborted: local JSON parse failed ($($_.Exception.Message))" return $null diff --git a/version.txt b/version.txt index abe9e77..cc061fa 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -2.0.21-SAC +2.0.22-SAC