diff --git a/samy.ps1 b/samy.ps1 index 44af1d1..9c010fa 100644 --- a/samy.ps1 +++ b/samy.ps1 @@ -544,6 +544,77 @@ $ConfirmPreference = 'None' # - Level-based Event IDs and console colors # - Global in-memory log cache # - One-time Event Log/source initialization with optional auto-elevation + + function Ensure-SVSMspEventLog { + [CmdletBinding()] + param( + [string]$EventSource = "SVSMSP_Module", + [string]$EventLog = "SVSMSP Events" + ) + + try { + # If the log already exists, we're done + if ([System.Diagnostics.EventLog]::Exists($EventLog)) { + return + } + + # If the source exists but is bound to another log, rebind it + if ([System.Diagnostics.EventLog]::SourceExists($EventSource)) { + $current = [System.Diagnostics.EventLog]::LogNameFromSourceName($EventSource, '.') + if ($current -ne $EventLog) { + [System.Diagnostics.EventLog]::DeleteEventSource($EventSource) + } + } + + New-EventLog -LogName $EventLog -Source $EventSource -ErrorAction Stop + } + catch { + Write-Host "[Warning] Failed to ensure Event Log '$EventLog': $($_.Exception.Message)" -ForegroundColor Yellow + } +} + +function Write-SvsMspEventLog { + [CmdletBinding()] + param( + [Parameter(Mandatory)] + [string]$Message, + + [ValidateSet('Information','Warning','Error')] + [string]$EntryType = 'Information', + + [int]$EventId = 1000, + + [string]$EventSource = 'SVSMSP_Module', + [string]$EventLog = 'SVSMSP Events' + ) + + # First attempt + try { + Write-EventLog -LogName $EventLog -Source $EventSource -EntryType $EntryType -EventId $EventId -Message $Message -ErrorAction Stop + return + } + catch { + $errMsg = $_.Exception.Message + + # Only self-heal for the specific missing-log case + if ($errMsg -like '*The Log name*SVSMSP Events*does not exist*') { + Ensure-SVSMspEventLog -EventSource $EventSource -EventLog $EventLog + + # Retry once after creating the log + try { + Write-EventLog -LogName $EventLog -Source $EventSource -EntryType $EntryType -EventId $EventId -Message $Message -ErrorAction Stop + } + catch { + Write-Host "[Warning] Failed to write to '$EventLog' even after Ensure-SVSMspEventLog: $($_.Exception.Message)" -ForegroundColor Yellow + } + } + else { + Write-Host "[Warning] Failed to write to '$EventLog': $errMsg" -ForegroundColor Yellow + } + } +} + + function Write-LogHelper { <# .SYNOPSIS @@ -789,6 +860,10 @@ if (-not [System.Diagnostics.EventLog]::SourceExists('$EventSource')) { $invokeParams.PassThru = $true } + if ($LogToEvent.IsPresent) { + Ensure-SVSMspEventLog -EventSource $EventSource -EventLog $EventLog + } + if ($PSBoundParameters.ContainsKey('ForegroundColorOverride')) { # 1) print to console with the override color Write-Host $formatted -ForegroundColor $ForegroundColorOverride