PowerShell | Comment déconnecter les utilisateurs Windows à distance
Parfois la session reste bloqué parce que nous ne nous sommes pas déconnecté correctement en fermant la session. D'autres fois, c'est un utilisateur qui reste connecté à son ordinateur trop longtemps sans raison.
De plus en plus, vous allez devoir intervenir sur les ordinateurs des utilisateurs qui n'ont pas suivi la consigne de déconnexion et vous devrez fermer les sessions distante afin de libérer de la place.PS> quser
USERNAME SESSIONNAME ID STATE IDLE TIME LOGON TIME
User1 6 Disc 1+15:55 1/9/2023 8:52 AM
Pour interroger des ordinateurs distants, nous pouvons utiliser le commutateur /server ou invoquer le poste distant :
Invoke-Command -ComputerName 'OrdinateurDistant' -ScriptBlock { quser }USERNAME SESSIONNAME ID STATE IDLE TIME LOGON TIMEUser1 6 Disc 1+15:55 1/9/2023 8:52 AMUser2 rdp-tcp#40 10 Active 3 1/12/2023 3:54 PM
Nous forcerions la fermeture de la session distante avec la commande logoff comme cela :
Invoke-Command -ComputerName 'OrdinateurDistant' -ScriptBlock { logoff 10 }
Et en local :
Invoke-Command -ScriptBlock { logoff 10 }
Si nous exécutons à nouveau quser, nous constatons que la session User2 a été déconnecté.
Sur le blog de ipswitch, il est proposé de rassembler les deux commandes afin de pouvoir indiquer le nom d'un utilisateur plutôt que l'ID de la session, comme ceci :
$scriptBlock = {
$ErrorActionPreference = 'Stop'
try {
## Find all sessions matching the specified username
$sessions = quser | Where-Object {$_ -match 'abertram'}
## Parse the session IDs from the output
$sessionIds = ($sessions -split ' +')[2]
Write-Host "Found $(@($sessionIds).Count) user login(s) on computer."
## Loop through each session ID and pass each to the logoff command
$sessionIds | ForEach-Object {
Write-Host "Logging off session id [$($_)]..."
logoff $_
}
} catch {
if ($_.Exception.Message -match 'No user exists') {
Write-Host "The user is not logged in."
} else {
throw $_.Exception.Message
}
}
}
## Run the scriptblock's code on the remote computer
PS> Invoke-Command -ComputerName REMOTECOMPUTER -ScriptBlock $scriptBlock
Found 1 user login(s) on computer.
Logging off session id [rdp-tcp#40] ...
Nous pouvons constater que la commande Invoke permet la création du scriptblock pour détecter si l'utilisateur indiqué est connecté et le déconnecte.
Ouaw !