Effectuez une analyse médico-légale complète en corrélant l'ID d'événement 4624 avec les événements de sécurité associés pour l'enquête sur les incidents.
Corrélez avec les événements de déconnexion (4634) pour suivre la durée de la session :
# Trouver les paires de connexion/déconnexion correspondantes
$LogonEvents = Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4624} -MaxEvents 100
$LogoffEvents = Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4634} -MaxEvents 100
$SessionAnalysis = foreach ($logon in $LogonEvents) {
$logonXml = [xml]$logon.ToXml()
$logonData = $logonXml.Event.EventData.Data
$logonId = ($logonData | Where-Object {$_.Name -eq 'TargetLogonId'}).'#text'
$userName = ($logonData | Where-Object {$_.Name -eq 'TargetUserName'}).'#text'
$matchingLogoff = $LogoffEvents | Where-Object {
$logoffXml = [xml]$_.ToXml()
$logoffData = $logoffXml.Event.EventData.Data
$logoffId = ($logoffData | Where-Object {$_.Name -eq 'TargetLogonId'}).'#text'
$logoffId -eq $logonId
} | Select-Object -First 1
[PSCustomObject]@{
User = $userName
LogonTime = $logon.TimeCreated
LogoffTime = if ($matchingLogoff) { $matchingLogoff.TimeCreated } else { 'Still Active' }
SessionDuration = if ($matchingLogoff) {
New-TimeSpan -Start $logon.TimeCreated -End $matchingLogoff.TimeCreated
} else { 'Ongoing' }
LogonId = $logonId
}
}
$SessionAnalysis | Format-Table -AutoSize
Analysez les modèles d'authentification et détectez les anomalies :
# Détecter les heures ou fréquences de connexion inhabituelles
$TimeWindow = (Get-Date).AddDays(-7)
$RecentLogons = Get-WinEvent -FilterHashtable @{
LogName='Security'
Id=4624
StartTime=$TimeWindow
}
# Grouper par utilisateur et analyser les modèles
$UserPatterns = $RecentLogons | ForEach-Object {
$xml = [xml]$_.ToXml()
$eventData = $xml.Event.EventData.Data
[PSCustomObject]@{
User = ($eventData | Where-Object {$_.Name -eq 'TargetUserName'}).'#text'
Time = $_.TimeCreated
Hour = $_.TimeCreated.Hour
DayOfWeek = $_.TimeCreated.DayOfWeek
LogonType = ($eventData | Where-Object {$_.Name -eq 'LogonType'}).'#text'
SourceIP = ($eventData | Where-Object {$_.Name -eq 'IpAddress'}).'#text'
}
} | Group-Object User
# Identifier les utilisateurs avec des modèles inhabituels
foreach ($userGroup in $UserPatterns) {
$user = $userGroup.Name
$logons = $userGroup.Group
# Vérifier l'activité hors heures (avant 6h ou après 22h)
$offHoursLogons = $logons | Where-Object {$_.Hour -lt 6 -or $_.Hour -gt 22}
if ($offHoursLogons) {
Write-Host "ALERTE : L'utilisateur $user a des connexions hors heures :" -ForegroundColor Red
$offHoursLogons | Format-Table Time, LogonType, SourceIP
}
}
Exporter un rapport médico-légal complet :
# Générer un rapport médico-légal détaillé
$ForensicReport = Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4624} -MaxEvents 1000 |
ForEach-Object {
$xml = [xml]$_.ToXml()
$eventData = $xml.Event.EventData.Data
[PSCustomObject]@{
EventTime = $_.TimeCreated
EventID = $_.Id
SubjectUserName = ($eventData | Where-Object {$_.Name -eq 'SubjectUserName'}).'#text'
TargetUserName = ($eventData | Where-Object {$_.Name -eq 'TargetUserName'}).'#text'
LogonType = ($eventData | Where-Object {$_.Name -eq 'LogonType'}).'#text'
LogonProcessName = ($eventData | Where-Object {$_.Name -eq 'LogonProcessName'}).'#text'
AuthenticationPackageName = ($eventData | Where-Object {$_.Name -eq 'AuthenticationPackageName'}).'#text'
WorkstationName = ($eventData | Where-Object {$_.Name -eq 'WorkstationName'}).'#text'
SourceNetworkAddress = ($eventData | Where-Object {$_.Name -eq 'IpAddress'}).'#text'
SourcePort = ($eventData | Where-Object {$_.Name -eq 'IpPort'}).'#text'
}
}
$ForensicReport | Export-Csv -Path "C:\Forensics\Logon_Analysis_$(Get-Date -Format 'yyyyMMdd_HHmmss').csv" -NoTypeInformation
Avertissement : Une analyse médico-légale à grande échelle peut consommer des ressources système importantes. Exécutez pendant les fenêtres de maintenance lorsque cela est possible.