Session À Distance De Déconnexion De Powershell

j'essaie de formuler une commande Powershell pour déconnecter un utilisateur à distance. Nous avons un serveur de terminal avec un programme très instable qui bloque parfois les sessions. Nous devons déconnecter à distance un utilisateur mais j'essaie d'écrire une déclaration Powershell qui va déconnecter la personne qui a lancé le script. J'ai cherché sur Google, et j'ai trouvé cette commande:

Invoke-Command -ComputerName MyServer -Command {shutdown -l}

Toutefois, la commande renvoie "fonction incorrecte."Je peux exécuter d'autres commandes avec succès dans les crochets, comme Get-Process.

l'idée est pour moi de mettre cela dans un script que les utilisateurs peuvent exécuter pour se déconnecter du serveur (depuis quand il se bloque, ils ne peuvent pas accéder au menu Démarrer ou ALT+CTRL+END pour le faire à travers l'interface graphique).

Le flux serait ce: Bob se connecte à MyServer via RDP mais sa session se bloque. Sur son bureau local, il peut exécuter MyScript (contenant une commande similaire à celle ci-dessus) qui déconnectera sa session sur MyServer.

26
demandé sur Adi Inbar 2013-08-12 21:09:01

10 réponses

peut-être étonnamment, vous pouvez déconnecter les utilisateurs avec la commande logoff .

C:\> logoff /?
Terminates a session.

LOGOFF [sessionname | sessionid] [/SERVER:servername] [/V] [/VM]

  sessionname         The name of the session.
  sessionid           The ID of the session.
  /SERVER:servername  Specifies the Remote Desktop server containing the user
                      session to log off (default is current).
  /V                  Displays information about the actions performed.
  /VM                 Logs off a session on server or within virtual machine.
                      The unique ID of the session needs to be specified.

l'ID de session peut être déterminé avec les commandes qwinsta ( query session ) ou quser ( query user ) (voir ici ):

$server   = 'MyServer'
$username = $env:USERNAME

$session = ((quser /server:$server | ? { $_ -match $username }) -split ' +')[2]

logoff $session /server:$server
43
répondu Ansgar Wiechers 2013-08-12 17:52:14

Voici une excellente solution scénarisée pour déconnecter les gens à distance ou localement. J'utilise qwinsta pour obtenir des informations de session et construire un tableau à partir de la sortie donnée. Cela rend vraiment facile d'itérer à travers chaque entrée et de se déconnecter seulement les utilisateurs réels, et pas le système ou L'auditeur RDP lui-même qui jette généralement juste une erreur Accès refusé de toute façon.

$serverName = "Name of server here OR localhost"
$sessions = qwinsta /server $serverName| ?{ $_ -notmatch '^ SESSIONNAME' } | %{
$item = "" | Select "Active", "SessionName", "Username", "Id", "State", "Type", "Device"
$item.Active = $_.Substring(0,1) -match '>'
$item.SessionName = $_.Substring(1,18).Trim()
$item.Username = $_.Substring(19,20).Trim()
$item.Id = $_.Substring(39,9).Trim()
$item.State = $_.Substring(48,8).Trim()
$item.Type = $_.Substring(56,12).Trim()
$item.Device = $_.Substring(68).Trim()
$item
} 

foreach ($session in $sessions){
    if ($session.Username -ne "" -or $session.Username.Length -gt 1){
        logoff /server $serverName $session.Id
    }
}

dans la première ligne de ce script donner $serverName la valeur appropriée ou localhost si exécuté localement. J'utilise ce script pour le coup les utilisateurs avant d'un processus automatisé tente de déplacer certains dossiers. Empêche "fichier en cours d'utilisation" erreurs pour moi. Une autre note, ce script devra être lancé en tant qu'utilisateur administrateur sinon vous pouvez être accédé nié en essayant de déconnecter quelqu'un. Espérons que cette aide!

11
répondu Jason Slobotski 2016-03-07 16:29:51

ajouter des commandes DOS simples, si quelqu'un est ainsi incliné. Oui, cela fonctionne toujours pour Win 8 et Server 2008 + Server 2012.

Query session /server:Server100

Sera de retour:

SESSIONNAME       USERNAME                 ID  STATE   TYPE        DEVICE
rdp-tcp#0         Bob                       3  Active  rdpwd
rdp-tcp#5         Jim                       9  Active  rdpwd
rdp-tcp                                 65536  Listen

et pour déconnecter une session, utilisez:

Reset session 3 /server:Server100
10
répondu user4317867 2015-10-04 16:26:26

c'est de la vieille école et est antérieur à PowerShell, mais j'ai utilisé le combo qwinsta / rwinsta pendant des années pour déconnecter à distance les sessions RDP vétustes. Il est intégré sur au moins Windows XP et forward (éventuellement plus tôt)

déterminer L'ID de session:

qwinsta /SERVER:<NAME>

supprimer la session en question:

rwinsta <SESSION_ID> /SERVER:<NAME>
7
répondu Joshua McKinnon 2013-08-12 18:32:00

Essayez le Services Terminal server Module PowerShell :

Get-TSSession -ComputerName comp1 -UserName user1 | Stop-TSSession -Force
4
répondu Shay Levy 2013-08-12 18:18:51

vous pouvez utiliser Invoke-RDUserLogoff

exemple de journalisation des utilisateurs D'Active Directory d'une unité organisationnelle spécifique:

$users = Get-ADUser -filter * -SearchBase "ou=YOUR_OU_NAME,dc=contoso,dc=com"

Get-RDUserSession | where { $users.sAMAccountName -contains $_.UserName } | % { $_ | Invoke-RDUserLogoff -Force }

à l'extrémité de la pipe, si vous essayez d'utiliser seulement foreach (%), il se déconnectera seulement un utilisateur. Mais en utilisant cette combinaison de foreach et pipe:

| % { $_ | commande }

fonctionnera comme prévu.

Ps. Exécuter en tant qu'Admissible

4
répondu Gauss 2015-10-04 14:48:53

j'ai modifié Casey réponse à seulement déconnexion des sessions déconnectées de la manière suivante:

   foreach($Server in $Servers) {
    try {
        query user /server:$Server 2>&1 | select -skip 1 | ? {($_ -split "\s+")[-5] -eq 'Disc'} | % {logoff ($_ -split "\s+")[-6] /server:$Server /V}
    }
    catch {}
    }
3
répondu O.C. 2017-05-23 12:03:06

déconnecter tous les utilisateurs d'une machine:

try {
   query user /server:$SERVER 2>&1 | select -skip 1 | foreach {
     logoff ($_ -split "\s+")[-6] /server:$SERVER
   }
}
catch {}

détails:

  • le try / catch est utilisé lorsqu'il n'y a pas d'utilisateurs sont sur le serveur, et le query renvoie une erreur. cependant, vous pouvez laisser tomber la partie 2>&1 , et supprimer le try / catch si vous ne vous gênez pas de voir la chaîne d'erreur
  • select -skip 1 supprime la ligne d'en-tête
  • le intérieur foreach se connecte chaque utilisateur
  • ($_ -split "\s+") divise la chaîne à un tableau avec juste des éléments de texte
  • [-6] index obtient l'ID de session et est la 6ème chaîne de comptage à partir de l'inverse du tableau, vous devez le faire parce que la sortie query aura soit 8 ou 9 éléments selon si les utilisateurs connectés ou déconnectés de la session du terminal
2
répondu cmcginty 2014-06-06 02:32:19

puisque nous sommes dans la zone de PowerShell, c'est très utile si nous pouvons rendre un objet de PowerShell approprié ...

j'aime personnellement cette méthode d'analyse, pour la terseness:

((quser) -replace '^>', '') -replace '\s{2,}', ',' | ConvertFrom-Csv

Note: cela ne tient pas compte des utilisateurs déconnectés ("disque"), mais fonctionne bien si vous voulez juste obtenir une liste rapide des utilisateurs et ne se soucient pas du reste de l'information. Je voulais juste une liste et ne se soucient pas si elles étaient actuellement déconnecté.

si vous vous souciez du reste des données, c'est juste un peu plus complexe:

(((quser) -replace '^>', '') -replace '\s{2,}', ',').Trim() | ForEach-Object {
    if ($_.Split(',').Count -eq 5) {
        Write-Output ($_ -replace '(^[^,]+)', ',')
    } else {
        Write-Output $_
    }
} | ConvertFrom-Csv

je vais un peu plus loin et vous donne un objet très propre sur mon blog.

0
répondu VertigoRay 2018-07-16 22:42:33

ci-dessous le script fonctionnera bien pour les sessions actives et déconnectées aussi longtemps que l'Utilisateur a accès à distance à la commande run logoff. Tout ce que vous avez à faire est de changer le servername de "votre ServerName" sur la quatrième ligne.

param (
    $queryResults = $null,
    [string]$UserName = $env:USERNAME,
    [string]$ServerName = "YourServerName"
)


if (Test-Connection $ServerName -Count 1 -Quiet) {  
    Write-Host "`n`n`n$ServerName is online!" -BackgroundColor Green -ForegroundColor Black


    Write-Host ("`nQuerying Server: `"$ServerName`" for disconnected sessions under UserName: `"" + $UserName.ToUpper() + "`"...") -BackgroundColor Gray -ForegroundColor Black

        query user $UserName /server:$ServerName 2>&1 | foreach {  

            if ($_ -match "Active") {
                Write-Host "Active Sessions"
                $queryResults = ("`n$ServerName," + (($_.trim() -replace ' {2,}', ','))) | ConvertFrom-Csv -Delimiter "," -Header "ServerName","UserName","SessionName","SessionID","CurrentState","IdealTime","LogonTime"


                $queryResults | ft
                Write-Host "Starting logoff procedure..." -BackgroundColor Gray -ForegroundColor Black

                $queryResults | foreach {
                    $Sessionl = $_.SessionID
                    $Serverl = $_.ServerName
                    Write-Host "Logging off"$_.username"from $serverl..." -ForegroundColor black -BackgroundColor Gray
                    sleep 2
                    logoff $Sessionl /server:$Serverl /v

                }


            }                
            elseif ($_ -match "Disc") {
                Write-Host "Disconnected Sessions"
                $queryResults = ("`n$ServerName," + (($_.trim() -replace ' {2,}', ','))) |  ConvertFrom-Csv -Delimiter "," -Header "ServerName","UserName","SessionID","CurrentState","IdealTime","LogonTime"

                $queryResults | ft
                Write-Host "Starting logoff procedure..." -BackgroundColor Gray -ForegroundColor Black

                $queryResults | foreach {
                    $Sessionl = $_.SessionID
                    $Serverl = $_.ServerName
                    Write-Host "Logging off"$_.username"from $serverl..."
                    sleep 2
                    logoff $Sessionl /server:$Serverl /v

                }
            }
            elseif ($_ -match "The RPC server is unavailable") {

                Write-Host "Unable to query the $ServerName, check for firewall settings on $ServerName!" -ForegroundColor White -BackgroundColor Red
            }
            elseif ($_ -match "No User exists for") {Write-Host "No user session exists"}

    }
}
else {

    Write-Host "`n`n`n$ServerName is Offline!" -BackgroundColor red -ForegroundColor white
    Write-Host "Error: Unable to connect to $ServerName!" -BackgroundColor red -ForegroundColor white
    Write-Host "Either the $ServerName is down or check for firewall settings on server $ServerName!" -BackgroundColor Yellow -ForegroundColor black
}





Read-Host "`n`nScript execution finished, press enter to exit!"

quelques exemples de sorties. Pour une session active: enter image description here

pour les sessions déconnectées: enter image description here

si aucune session trouvée: enter image description here Vérifiez cette solution aussi bien pour interroger tous les serveurs publicitaires pour votre nom d'utilisateur et logoff seulement les sessions déconnectées. Le script vous indiquera également s'il y a eu une erreur de connexion ou d'interrogation du serveur.

Powershell pour en savoir déconnecté session RDP et fermer la session dans le même temps

0
répondu LT- 2018-08-18 04:36:43