PowerShell | Comment déconnecter les utilisateurs Windows à distance

Rédigé par O. Clotaire Aucun commentaire
Classé dans : Windows, PowerShell Mots clés : PowerShell, Windows, Windows 10, RDP
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.

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 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 !

A PROPOS

  • Grace à mon expérience dans les Systèmes d'Information, j'ai le privilège de partager mon expérience en les centralisant sous la forme d’une base de connaissance.
  • Parfois certaines de nos questions ne trouvent pas toujours de réponse. Le domaine de l’informatique évolue rapidement, il est alors important de pouvoir profiter des solutions déjà expérimentés.
  • Ce site sera de plus en plus accessible.
  • Je vous remercie d’avance pour vos éventuelles remarques constructives permettant son amélioration.

Écrire un commentaire

 Se rappeler de moi sur ce site
Quelle est le premier caractère du mot xwzlcj ?

Fil RSS des commentaires de cet article

↓