Created
February 19, 2026 19:25
-
-
Save Rapidhands/1d9a1a747e411992db5c8423648e883e to your computer and use it in GitHub Desktop.
Log The userLgon in a shared file an d(optional in the event log "appliccation"
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # ============================================================ | |
| # Log-UserLogon.ps1 | |
| # À déployer en tant que script de connexion (GPO ou autre) | |
| # Écrit dans un fichier centralisé sur un partage réseau : | |
| # "<UserName> s'est connecté sur <NomMachine>" | |
| # ============================================================ | |
| # ── CONFIGURATION ──────────────────────────────────────────── | |
| $SharePath = "\\SERVEUR\Partage\Logs" # <-- Modifier selon votre environnement | |
| $LogFile = Join-Path $SharePath "connexions.log" | |
| # ───────────────────────────────────────────────────────────── | |
| # Collecte des informations | |
| $UserName = $env:USERNAME | |
| $MachineName = $env:COMPUTERNAME | |
| $DateTime = Get-Date -Format "yyyy-MM-dd HH:mm:ss" | |
| # Construction de la ligne de log | |
| $LogEntry = "$DateTime | $UserName s'est connecté sur $MachineName" | |
| # Écriture dans le fichier (création automatique si inexistant) | |
| try { | |
| # Vérifier que le dossier de destination est accessible | |
| if (-not (Test-Path $SharePath)) | |
| { | |
| throw "Le chemin réseau est inaccessible : $SharePath" | |
| } | |
| # Ajout de l'entrée (thread-safe via mutex pour éviter les conflits d'écriture simultanée) | |
| $Mutex = New-Object System.Threading.Mutex($false, "Global\LogonLogMutex") | |
| $Mutex.WaitOne(500) | Out-Null # si le partage est un peu lent, paaser .1000 voire 2000 | |
| Add-Content -Path $LogFile -Value $LogEntry -Encoding UTF8 | |
| $Mutex.ReleaseMutex() | |
| $Mutex.Dispose() | |
| } | |
| catch { | |
| # En cas d'échec, journaliser localement dans le journal d'événements Windows | |
| $ErrorMsg = "Log-UserLogon.ps1 : Impossible d'écrire dans $LogFile. Erreur : $_" | |
| Write-EventLog -LogName "Application" ` | |
| -Source "Application" ` | |
| -EventId 9999 ` | |
| -EntryType Warning ` | |
| -Message $ErrorMsg | |
| } | |
| # ============================================================ | |
| # Log-UserLogoff.ps1 | |
| # À déployer en tant que script de déconnexion (GPO ou autre) | |
| # Recherche dans le fichier centralisé la ligne contenant | |
| # $UserName et $MachineName et la remplace par une ligne | |
| # de déconnexion. | |
| # ============================================================ | |
| # ── CONFIGURATION ──────────────────────────────────────────── | |
| $SharePath = "\\SERVEUR\Partage\Logs" # <-- Modifier selon votre environnement | |
| $LogFile = Join-Path $SharePath "connexions.log" | |
| # ───────────────────────────────────────────────────────────── | |
| # Collecte des informations | |
| $UserName = $env:USERNAME | |
| $MachineName = $Env:ComputerName | |
| $DateTime = Get-Date -Format "yyyy-MM-dd HH:mm:ss" | |
| # Construction de la nouvelle ligne | |
| $NewEntry = "$DateTime | $UserName s'est déconnecté de $MachineName" | |
| try { | |
| if (-not (Test-Path $LogFile)) | |
| { | |
| throw "Le fichier de log est introuvable : $LogFile" | |
| } | |
| $Mutex = New-Object System.Threading.Mutex($false, "Global\LogonLogMutex") | |
| $acquired = $Mutex.WaitOne(500) | |
| try { | |
| # Lecture de toutes les lignes | |
| $Lines = Get-Content -Path $LogFile -Encoding UTF8 | |
| $Replaced = $false | |
| # Remplacement de la ligne correspondant à cet utilisateur sur cette machine | |
| # On recherche une ligne qui contient à la fois $UserName ET $MachineName | |
| $UpdatedLines = $Lines | ForEach-Object { | |
| if (-not $Replaced -and $_ -match [regex]::Escape($UserName) -and $_ -match [regex]::Escape($MachineName)) | |
| { | |
| $NewEntry # On remplace la ligne trouvée | |
| $Replaced = $true | |
| } | |
| else | |
| { | |
| $_ # On conserve les autres lignes intactes | |
| } | |
| } #end Foreac-object | |
| if (-not $Replaced) | |
| { | |
| # Aucune ligne de connexion trouvée : on ajoute quand même une trace | |
| $UpdatedLines = $Lines + "$DateTime | $UserName s'est déconnecté de $MachineName (aucune connexion trouvée)" | |
| Write-EventLog -LogName "Application" ` | |
| -Source "Application" ` | |
| -EventId 9998 ` | |
| -EntryType Warning ` | |
| -Message "Log-UserLogoff.ps1 : Aucune ligne de connexion trouvée pour $UserName sur $MachineName" | |
| } # end if | |
| # Réécriture complète du fichier | |
| Set-Content -Path $LogFile -Value $UpdatedLines -Encoding UTF8 | |
| }# end try | |
| finally { | |
| # On libère le mutex dans tous les cas (même si une erreur survient) | |
| if ($acquired) | |
| { | |
| $Mutex.ReleaseMutex() | |
| } | |
| $Mutex.Dispose() | |
| }#end finnaly | |
| } # end try | |
| catch | |
| { | |
| $ErrorMsg = "Log-UserLogoff.ps1 : Erreur lors de la mise à jour de $LogFile. Erreur : $_" | |
| Write-EventLog -LogName "Application" ` | |
| -Source "Application" ` | |
| -EventId 9999 ` | |
| -EntryType Warning ` | |
| -Message $ErrorMsg | |
| }#end catch |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment