Gestion des utilisateur en RDS

Avec le module RemoteDesktop

Lister les sessions

Import-Module RemoteDesktop
Get-RDUserSession -ConnectionBroker "broker.domaine.local" |
    Select-Object UserName, HostServer, UnifiedSessionId, SessionState

Fermer (déconnecter l’utilisateur) une session précise

Invoke-RDUserLogoff -HostServer "RDSH01.domaine.local" -UnifiedSessionID 3 -Force

Fermer toutes les sessions d’un utilisateur

Get-RDUserSession -ConnectionBroker "broker.domaine.local" |
    Where-Object { $_.UserName -eq "jdupont" } |
    ForEach-Object {
        Invoke-RDUserLogoff -HostServer $_.HostServer -UnifiedSessionID $_.UnifiedSessionId -Force
    }

Fermer toutes les sessions déconnectées

Get-RDUserSession -ConnectionBroker "broker.domaine.local" |
    Where-Object { $_.SessionState -eq "STATE_DISCONNECTED" } |
    ForEach-Object {
        Invoke-RDUserLogoff -HostServer $_.HostServer -UnifiedSessionID $_.UnifiedSessionId -Force
    }

Avec les commandes natives

(sans Broker, fonctionne partout)

# Lister les sessions sur un serveur
quser /server:RDSH01

# Fermer la session ID 3
logoff 3 /server:RDSH01

# Réinitialiser une session bloquée (plus brutal)
rwinsta 3 /server:RDSH01

Exemple en PowerShell

$serveur = "RDSH01"
$user = "jdupont"

quser /server:$serveur 2>$null | Select-Object -Skip 1 | ForEach-Object {
    $ligne = $_.Trim() -replace '\s{2,}', ','
    $champs = $ligne -split ','
    if ($champs[0] -replace '^>', '' -eq $user) {
        # L'ID est en 2e ou 3e position selon que la session est active ou déconnectée
        $id = ($champs | Where-Object { $_ -match '^\d+$' } | Select-Object -First 1)
        logoff $id /server:$serveur
        Write-Host "Session $id de $user fermée sur $serveur"
    }
}

Attention : logoff et Invoke-RDUserLogoff ferment la session sans sauvegarde, donc le travail non enregistré de l’utilisateur est perdu. Il faut aussi des droits d’administrateur sur le serveur hôte.