Skip to content

Instantly share code, notes, and snippets.

@Rapidhands
Created February 19, 2026 19:25
Show Gist options
  • Select an option

  • Save Rapidhands/1d9a1a747e411992db5c8423648e883e to your computer and use it in GitHub Desktop.

Select an option

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"
# ============================================================
# 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