Refactor: add DetailCount parameter, structured history, UTF8 fix (PS5 compatible)
This commit is contained in:
@ -1,4 +1,4 @@
|
|||||||
<#
|
<#
|
||||||
.SYNOPSIS
|
.SYNOPSIS
|
||||||
Milestone XProtect Incident Report Generator
|
Milestone XProtect Incident Report Generator
|
||||||
|
|
||||||
@ -9,75 +9,64 @@ Analyse les événements Windows liés à Milestone XProtect :
|
|||||||
- Crash VideoOS
|
- Crash VideoOS
|
||||||
- Erreurs disque (Event ID 7)
|
- Erreurs disque (Event ID 7)
|
||||||
|
|
||||||
|
Génère :
|
||||||
|
- Synthèse console
|
||||||
|
- 3 dernières erreurs significatives
|
||||||
|
- Historique complet structuré
|
||||||
|
|
||||||
.PARAMETER Days
|
.PARAMETER Days
|
||||||
Nombre de jours à analyser (défaut : 4)
|
Nombre de jours à analyser (défaut : 4)
|
||||||
|
|
||||||
.EXAMPLE
|
|
||||||
.\Milestone_Incident_Report.ps1 -Days 7 -Verbose
|
|
||||||
|
|
||||||
.AUTHOR
|
.AUTHOR
|
||||||
Sébastien Couratin – Semper Connect
|
Sébastien Couratin – Semper Connect
|
||||||
|
|
||||||
.LICENSE
|
.LICENSE
|
||||||
GNU AGPL-3.0
|
GNU AGPL-3.0
|
||||||
#>
|
#>
|
||||||
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
|
|
||||||
|
|
||||||
|
|
||||||
param(
|
param(
|
||||||
[int]$Days = 4
|
[int]$Days = 4,
|
||||||
|
[int]$DetailCount = 3
|
||||||
)
|
)
|
||||||
|
|
||||||
Write-Verbose "Analyse des $Days derniers jours"
|
|
||||||
|
# Encodage UTF8 console
|
||||||
|
chcp 65001 > $null
|
||||||
|
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
|
||||||
|
|
||||||
$start = (Get-Date).AddDays(-$Days)
|
$start = (Get-Date).AddDays(-$Days)
|
||||||
|
|
||||||
Write-Verbose "Date de début d'analyse : $start"
|
Write-Verbose "Analyse des $Days derniers jours"
|
||||||
|
Write-Verbose "Date de début : $start"
|
||||||
|
|
||||||
# ==========================================================
|
# ==========================================================
|
||||||
# 🔵 REDÉMARRAGES SERVEUR
|
# 🔎 RÉCUPÉRATION DES ÉVÉNEMENTS
|
||||||
# ==========================================================
|
# ==========================================================
|
||||||
|
|
||||||
Write-Verbose "Recherche des redémarrages serveur..."
|
|
||||||
|
|
||||||
$reboots = Get-WinEvent -FilterHashtable @{
|
$reboots = Get-WinEvent -FilterHashtable @{
|
||||||
LogName='System'
|
LogName='System'
|
||||||
StartTime=$start
|
StartTime=$start
|
||||||
} | Where-Object {
|
} -ErrorAction SilentlyContinue | Where-Object {
|
||||||
($_.Id -eq 12 -and $_.ProviderName -eq "Microsoft-Windows-Kernel-General") -or
|
($_.Id -eq 12 -and $_.ProviderName -eq "Microsoft-Windows-Kernel-General") -or
|
||||||
($_.Id -eq 41) -or
|
($_.Id -eq 41) -or
|
||||||
($_.Id -eq 1074)
|
($_.Id -eq 1074)
|
||||||
}
|
}
|
||||||
|
|
||||||
# ==========================================================
|
|
||||||
# 🟡 CRASH SERVICE RECORDING
|
|
||||||
# ==========================================================
|
|
||||||
|
|
||||||
Write-Verbose "Recherche des crash Recording Server..."
|
|
||||||
|
|
||||||
$recordingCrash = Get-WinEvent -FilterHashtable @{
|
$recordingCrash = Get-WinEvent -FilterHashtable @{
|
||||||
LogName='System'
|
LogName='System'
|
||||||
Id=7031
|
Id=7031
|
||||||
StartTime=$start
|
StartTime=$start
|
||||||
} | Where-Object {$_.Message -like "*Recording Server*"}
|
} -ErrorAction SilentlyContinue | Where-Object {
|
||||||
|
$_.Message -like "*Recording Server*"
|
||||||
# ==========================================================
|
}
|
||||||
# 🔴 CRASH APPLICATION VIDEOOS
|
|
||||||
# ==========================================================
|
|
||||||
|
|
||||||
Write-Verbose "Recherche des crash VideoOS..."
|
|
||||||
|
|
||||||
$videoOSCrash = Get-WinEvent -FilterHashtable @{
|
$videoOSCrash = Get-WinEvent -FilterHashtable @{
|
||||||
LogName='Application'
|
LogName='Application'
|
||||||
Id=1000
|
Id=1000
|
||||||
StartTime=$start
|
StartTime=$start
|
||||||
} | Where-Object {$_.Message -like "*VideoOS*"}
|
} -ErrorAction SilentlyContinue | Where-Object {
|
||||||
|
$_.Message -like "*VideoOS*"
|
||||||
# ==========================================================
|
}
|
||||||
# ⚠️ ERREURS DISQUE (ID 7)
|
|
||||||
# ==========================================================
|
|
||||||
|
|
||||||
Write-Verbose "Recherche des erreurs disque (ID 7)..."
|
|
||||||
|
|
||||||
$diskErrors = Get-WinEvent -FilterHashtable @{
|
$diskErrors = Get-WinEvent -FilterHashtable @{
|
||||||
LogName='System'
|
LogName='System'
|
||||||
@ -85,16 +74,68 @@ $diskErrors = Get-WinEvent -FilterHashtable @{
|
|||||||
StartTime=$start
|
StartTime=$start
|
||||||
} -ErrorAction SilentlyContinue
|
} -ErrorAction SilentlyContinue
|
||||||
|
|
||||||
|
if (-not $diskErrors) { $diskErrors = @() }
|
||||||
$last3DiskErrors = $diskErrors | Sort-Object TimeCreated -Descending | Select-Object -First 3
|
|
||||||
|
|
||||||
# ==========================================================
|
# ==========================================================
|
||||||
# 📊 AFFICHAGE SYNTHÈSE CONSOLE
|
# 🧠 CONSTRUCTION HISTORIQUE STRUCTURÉ
|
||||||
|
# ==========================================================
|
||||||
|
|
||||||
|
$allEvents = @()
|
||||||
|
|
||||||
|
foreach ($evt in $videoOSCrash) {
|
||||||
|
$allEvents += [PSCustomObject]@{
|
||||||
|
Time = $evt.TimeCreated
|
||||||
|
Type = "CRASH VIDEOOS"
|
||||||
|
Severity = "CRITICAL"
|
||||||
|
Message = $evt.Message
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($evt in $recordingCrash) {
|
||||||
|
$allEvents += [PSCustomObject]@{
|
||||||
|
Time = $evt.TimeCreated
|
||||||
|
Type = "CRASH RECORDING"
|
||||||
|
Severity = "CRITICAL"
|
||||||
|
Message = $evt.Message
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($evt in $diskErrors) {
|
||||||
|
$allEvents += [PSCustomObject]@{
|
||||||
|
Time = $evt.TimeCreated
|
||||||
|
Type = "ERREUR DISQUE"
|
||||||
|
Severity = "CRITICAL"
|
||||||
|
Message = $evt.Message
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($evt in $reboots) {
|
||||||
|
$allEvents += [PSCustomObject]@{
|
||||||
|
Time = $evt.TimeCreated
|
||||||
|
Type = "REDÉMARRAGE SERVEUR"
|
||||||
|
Severity = "WARNING"
|
||||||
|
Message = "EventID $($evt.Id)"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$allEvents = $allEvents | Sort-Object Time
|
||||||
|
|
||||||
|
# ==========================================================
|
||||||
|
# 🎯 3 DERNIÈRES ERREURS SIGNIFICATIVES
|
||||||
|
# ==========================================================
|
||||||
|
|
||||||
|
$lastCritical = $allEvents |
|
||||||
|
Where-Object {$_.Severity -eq "CRITICAL"} |
|
||||||
|
Sort-Object Time -Descending |
|
||||||
|
Select-Object -First $DetailCount
|
||||||
|
|
||||||
|
# ==========================================================
|
||||||
|
# 📊 SYNTHÈSE CONSOLE
|
||||||
# ==========================================================
|
# ==========================================================
|
||||||
|
|
||||||
Write-Host ""
|
Write-Host ""
|
||||||
Write-Host "==============================================="
|
Write-Host "==============================================="
|
||||||
Write-Host " SYNTHÈSE INCIDENTS MILSTONE XPROTECT"
|
Write-Host " SYNTHÈSE INCIDENTS MILESTONE XPROTECT"
|
||||||
Write-Host "==============================================="
|
Write-Host "==============================================="
|
||||||
Write-Host "Période analysée : $Days jours"
|
Write-Host "Période analysée : $Days jours"
|
||||||
Write-Host ""
|
Write-Host ""
|
||||||
@ -105,9 +146,9 @@ Write-Host "Crash Application VideoOS :" $videoOSCrash.Count
|
|||||||
Write-Host "Erreurs disque (ID 7) :" $diskErrors.Count
|
Write-Host "Erreurs disque (ID 7) :" $diskErrors.Count
|
||||||
Write-Host ""
|
Write-Host ""
|
||||||
|
|
||||||
if ($last3DiskErrors.Count -gt 0) {
|
if ($lastCritical.Count -gt 0) {
|
||||||
Write-Host "3 dernières erreurs disque :"
|
Write-Host "$DetailCount dernières erreurs significatives :"
|
||||||
$last3DiskErrors | Format-Table TimeCreated, ProviderName -AutoSize
|
$lastCritical | Format-Table Time, Type -AutoSize
|
||||||
}
|
}
|
||||||
|
|
||||||
# ==========================================================
|
# ==========================================================
|
||||||
@ -124,7 +165,7 @@ $reportPath = Join-Path $reportDir ("Milestone_Report_{0}.txt" -f (Get-Date -For
|
|||||||
|
|
||||||
$report = @()
|
$report = @()
|
||||||
$report += "==============================================="
|
$report += "==============================================="
|
||||||
$report += "RAPPORT INCIDENTS MILSTONE XPROTECT"
|
$report += "RAPPORT INCIDENTS MILESTONE XPROTECT"
|
||||||
$report += "==============================================="
|
$report += "==============================================="
|
||||||
$report += "Date génération : $(Get-Date)"
|
$report += "Date génération : $(Get-Date)"
|
||||||
$report += "Période analysée : $Days jours"
|
$report += "Période analysée : $Days jours"
|
||||||
@ -134,15 +175,23 @@ $report += "Crash Recording Server : $($recordingCrash.Count)"
|
|||||||
$report += "Crash Application VideoOS : $($videoOSCrash.Count)"
|
$report += "Crash Application VideoOS : $($videoOSCrash.Count)"
|
||||||
$report += "Erreurs disque (ID 7) : $($diskErrors.Count)"
|
$report += "Erreurs disque (ID 7) : $($diskErrors.Count)"
|
||||||
$report += ""
|
$report += ""
|
||||||
$report += "---- 3 DERNIÈRES ERREURS DISQUE ----"
|
|
||||||
|
|
||||||
foreach ($err in $last3DiskErrors) {
|
$report += "==== $DetailCount DERNIÈRES ERREURS SIGNIFICATIVES ===="
|
||||||
|
|
||||||
|
foreach ($err in $lastCritical) {
|
||||||
$report += "--------------------------------"
|
$report += "--------------------------------"
|
||||||
$report += "Date : $($err.TimeCreated)"
|
$report += "Date : $($err.Time)"
|
||||||
$report += "Source : $($err.ProviderName)"
|
$report += "Type : $($err.Type)"
|
||||||
$report += "Message : $($err.Message)"
|
$report += "Message : $($err.Message)"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$report += ""
|
||||||
|
$report += "==== HISTORIQUE COMPLET STRUCTURÉ ===="
|
||||||
|
|
||||||
|
foreach ($evt in $allEvents) {
|
||||||
|
$report += "$($evt.Time) | $($evt.Type) | $($evt.Severity)"
|
||||||
|
}
|
||||||
|
|
||||||
$report | Out-File -FilePath $reportPath -Encoding UTF8
|
$report | Out-File -FilePath $reportPath -Encoding UTF8
|
||||||
|
|
||||||
Write-Host ""
|
Write-Host ""
|
||||||
|
|||||||
Reference in New Issue
Block a user