private/Read-SafeClixml.ps1
|
function Read-SafeClixml { param([string]$Clixml) if ([string]::IsNullOrWhiteSpace($Clixml)) { return $null } if ($Clixml -match '<SBK') { Write-Warning "CLIXML contains ScriptBlock elements — skipping potentially unsafe deserialization" return $null } if ($Clixml -match '<Obj RefId="[^"]*"><TN[^>]*><T>System\.Management\.Automation\.ScriptBlock</T>') { Write-Warning "CLIXML contains ScriptBlock object references — skipping potentially unsafe deserialization" return $null } if ($Clixml -match '<MS[^>]*><TN[^>]*><T>System\.Management\.Automation\.PSMethod</T>') { Write-Warning "CLIXML contains CodeMethod or ScriptMethod elements — skipping potentially unsafe deserialization" return $null } try { return [System.Management.Automation.PSSerializer]::Deserialize($Clixml) } catch { Write-Warning "Failed to deserialize CLIXML: $_" return $null } } |