PowerShell | Comment déconnecter les utilisateurs Windows à distance
Rédigé par O. Clotaire
1 commentaire
Classé dans : Windows, PowerShell
Heureusement, nous pouvons prendre la main et forcer la fermeture des sessions à partir d’une autre machine.
Pour cela, nous utiliserons la commande quser :
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 TIME
User1 6 Disc 1+15:55 1/9/2023 8:52 AM
User2 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 !