Scripting - Come disconnettere le sessioni di Desktop remoto?


8

Sto cercando un modo per chiudere tutte le sessioni di Desktop remoto attive su un computer (computer locale). Windows include un paio di comandi (rwinsta, qwinsta, ecc.) Per guardare le sessioni attive, ma non vedo come potrei facilmente usare le informazioni (a meno che non analizzi la stringa ...) per chiudere tutte le sessioni.

C'è un modo in Powershell (o C #, Batch) per chiudere tutte le sessioni di Desktop remoto su un computer locale?

Grazie Martin


Ho aggiornato la mia risposta per includere un ciclo che disconnetterà solo le sessioni remote attive, non la console
Kevin Kuphal,

Risposte:


5

Puoi provare a utilizzare il /smparametro non documentato per query session(in un file batch) per ordinare le cose più facilmente:

FOR /f %%G IN ('query session /sm') DO tsdiscon %%G

È un buon inizio ... ma voglio disconnettere solo le sessioni di Desktop remoto.
Martin,

4

Sì, usando tsdiscon da una riga di comando:

tsdiscon n

dove n dovrebbe essere sostituito con l'id di sessione.

È possibile ottenere il numero di sessione da

query session

Dal momento che dici di voler chiudere tutte le sessioni sul computer locale, immagino che dovrai fare attenzione all'ordine in cui lo fai (cioè chiudere l'ultima sessione).


2

Potresti voler dare un'occhiata alle estensioni della community di Powershell. Include i cmdlet Get, Stop e Disconnect TerminalSession.


2

È possibile utilizzare l' utilità tsdiscon per disconnettere le sessioni. Se si utilizza il comando "sessioni di query" da un prompt dei comandi, è possibile visualizzare l'elenco di ID e quindi emettere un comando tsdiscon per ognuno.

Un costrutto a ciclo continuo come questo dovrebbe funzionare

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

dove si trova q.bat

query session /sm | find "Active"

Ciò disconnetterà solo le sessioni remote e ignorerà l'utente della console.


1

È possibile disconnettere le sessioni locali o remote con 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.

1

Ho scoperto che TSDISCON non rimuove le sessioni connesse "Disc".

Ho sostituito TSDISCON con disconnessione.



1

So che l'OP è piuttosto vecchio ora, ma questo dovrebbe fare quello che stai cercando (e nel caso in cui qualcun altro stia ancora cercando qualcosa per fare lo stesso, ho pensato di rispondere comunque).

Allo stesso modo potresti usare al query/reset sessionposto di 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
)

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)


0

Il comando TSDiscon disconnetterà le sessioni di Servizi terminal (RDP). Usato da solo disconnetterà la sessione corrente, è possibile specificare l'ID sessione della sessione che si desidera disconnettere, è inoltre possibile fornire il nome del server da cui disconnettersi.

I dettagli completi possono essere trovati qui .


0

Non hai specificato se vuoi farlo senza spegnere o riavviare il computer. Ma se non ti dispiace riavviare o spegnere puoi semplicemente chiamare:

shutdown -r -f -m \\computer_to_restart

Questo forzerà effettivamente un riavvio del computer.


Beh ... questa è un'idea. Ma non voglio uccidere tutte le sessioni. Solo le sessioni del desktop remoto.
Martin,

0

Anche se la domanda è molto antica, non esistono praticamente soluzioni per tutte le versioni senza qwinsta / query / tsdiscon, vale a dire tutte le versioni home di Windows.

Tuttavia, esiste una versione PowerShell facile per disconnettere una sessione:

$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)

È possibile ottenere un ID di sessione, ad es getProcesss. Con . Per disconnettere (non disconnettersi!) Utilizzare una sessione $tstType::DisconnectSession("localhost", 2).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.