Scripting - Comment déconnecter les sessions Remote Desktop?

8

Je recherche un moyen de fermer toutes les sessions actives du Bureau à distance sur un ordinateur (ordinateur local). Windows comprend quelques commandes (rwinsta, qwinsta, etc.) pour consulter les sessions actives, mais je ne vois pas comment je pourrais facilement utiliser les informations (sauf si j'analyse la chaîne ...) pour fermer toutes les sessions.

Existe-t-il un moyen dans Powershell (ou C #, Batch) de fermer toutes les sessions Bureau à distance sur un ordinateur local?

Merci, Martin

Martin
la source
J'ai mis à jour ma réponse pour inclure une boucle qui ne déconnectera que les sessions distantes actives, pas la console
Kevin Kuphal

Réponses:

5

Vous pouvez essayer d'utiliser le /smparamètre non documenté pour query session(dans un fichier de commandes) pour trier les choses plus facilement:

FOR /f %%G IN ('query session /sm') DO tsdiscon %%G
Adam Brand
la source
C'est un bon début ... mais je veux déconnecter uniquement les sessions Remote Desktop.
Martin
4

Oui, en utilisant tsdiscon à partir d'une ligne de commande:

tsdiscon n

où le n doit être remplacé par l'ID de session.

Vous pouvez obtenir le numéro de session auprès de

query session

Puisque vous dites que vous souhaitez fermer toutes les sessions sur l'ordinateur local, je suppose que vous devrez faire attention à l'ordre dans lequel vous le faites (c'est-à-dire fermer votre session en dernier).

Rob Levine
la source
2

Vous voudrez peut-être consulter les extensions de communauté Powershell. Il comprend les applets de commande Get, Stop et Disconnect TerminalSession.

Chad Miller
la source
2

Vous pouvez utiliser l' utilitaire tsdiscon pour déconnecter les sessions. Si vous utilisez la commande «Sessions de requête» à partir d'une invite de commandes, vous pouvez voir la liste des ID, puis émettre une commande tsdiscon pour chacun.

Une construction en boucle comme celle-ci devrait fonctionner

FOR /f %%G IN ('q.bat') DO tsdiscon %%G

où q.bat est

query session /sm | find "Active"

Cela déconnectera uniquement les sessions distantes et ignorera l'utilisateur de la console.

Kevin Kuphal
la source
1

Vous pouvez déconnecter des sessions locales ou distantes avec tsdiscon.

Disconnects a terminal session.

TSDISCON [sessionid | sessionname] [/SERVER:servername] [/V]

  sessionid           The ID of the session.
  sessionname         The name of the session.
  /SERVER:servername  Specifies the Terminal server (default is current).
  /V                  Displays information about the actions performed.
JasonMArcher
la source
1

J'ai trouvé que TSDISCON ne supprime pas les sessions connectées au "disque".

J'ai remplacé TSDISCON par une déconnexion.


la source
1

Je sais que l'OP est assez vieux maintenant, mais cela devrait faire ce que vous recherchez (et au cas où quelqu'un d'autre chercherait toujours quelque chose à faire de même, je pensais que je répondrais de toute façon).

De même, vous pouvez utiliser à la query/reset sessionplace de q/rwinsta...

FOR /F %%A IN (computers.txt) DO (
    FOR /f "tokens=2" %%i IN ('qwinsta /SERVER:%%A ^| find /i "disc"') DO ECHO %%i | rwinsta %%i /SERVER:%%A /V
)
Carly
la source
1

FOR /F %A IN (c:\scripts\ps\computers.txt) DO (FOR /f "tokens=2" %i IN ('qwinsta /SERVER:%A ^| find /i "disc"') **DO if "%i" NEQ "0" ECHO %i** | rwinsta %i /SERVER:%A /V)

Greg
la source
0

La commande TSDiscon déconnectera les sessions des services de terminal (RDP). Utilisé seul, il déconnectera la session en cours, vous pouvez spécifier l'ID de session de la session à laquelle vous souhaitez vous déconnecter, vous pouvez également fournir le nom du serveur pour vous déconnecter.

Tous les détails peuvent être trouvés ici .

Sam Cogan
la source
0

Vous n'avez pas spécifié si vous souhaitez le faire sans éteindre ou redémarrer l'ordinateur. Mais si cela ne vous dérange pas un redémarrage ou un arrêt, vous pouvez simplement appeler:

shutdown -r -f -m \\computer_to_restart

Cela forcera en fait un redémarrage de l'ordinateur.

Nick Berardi
la source
Eh bien ... c'est une idée. Mais je ne veux pas tuer toutes les sessions. Seules les sessions de bureau à distance.
Martin
0

Même la question est très ancienne, il n'y a pratiquement pas de solutions à toutes les versions sans qwinsta / query / tsdiscon, à savoir toutes les versions Windows home.

Cependant, il existe une version PowerShell facile pour déconnecter une session:

$code = @'
[DllImport("wtsapi32.dll")]
static extern IntPtr WTSOpenServer([MarshalAs(UnmanagedType.LPStr)] String pServerName);

[DllImport("wtsapi32.dll")]
static extern void WTSCloseServer(IntPtr hServer);

[DllImport("Wtsapi32.dll")]
static extern bool WTSDisconnectSession(System.IntPtr hServer, int SessionId, bool bWait);

public static void DisconnectSession (String ServerName, int SessionId)
{
    IntPtr serverHandle = WTSOpenServer(ServerName);
    WTSDisconnectSession(serverHandle, SessionId, true);
    WTSCloseServer(serverHandle);
}
'@

$tstType=Add-Type -name Test -MemberDefinition $code -PassThru
#$tstType::DisconnectSession("localhost", 2)

Un identifiant de session peut être obtenu, par exemple avec getProcesss. Pour déconnecter (pas se déconnecter!) Une session, utilisez $tstType::DisconnectSession("localhost", 2).

GMA
la source